假设我们有一个数组
String[] names = {"Bill", "Den", "James", "Den", "Loris", "Bill", "Den"};
如何在 for 循环中(或以其他方式)将这些行相互比较?我的任务正是打印重复的字符串(数组元素)的名称,并打印每个字符串在数组中出现的次数。
这是一个具体的例子,但有些地方不太对劲。
static public Map<String, Integer> getDuplicate(ArrayList<Unit> list) {
Map<String, Integer> dupEl = new HashMap<>();
int count = 0;
for (int i = list.size() - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (list.get(j).equals(list.get(i))) {
dupEl.put(list.get(i).toString(), ++count);
}
}
}
return dupEl;
}
单元类没什么花哨的,测试类:
public class Unit {
private String name;
private int age;
public Unit(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Unit unit = (Unit) o;
if (age != unit.age) return false;
return name != null ? name.equals(unit.name) : unit.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "name='" + name;
}
}
就此而言,这里是列表本身和方法调用:
ArrayList<Unit> mylist = new ArrayList<>();
mylist.add(new Unit("Edik", 40));
mylist.add(new Unit("Bill", 35));
mylist.add(new Unit("Grace", 25));
mylist.add(new Unit("Jason", 37));
mylist.add(new Unit("Edik", 40));
/* 1) Найти дубликаты в списке
* 2) Вывести название дублируемого объекта
* 3) Указать количество раз, когда встречается объект в списке.
* */
getDuplicate(mylist).forEach((k, v) -> System.out.println(k + ": " + v));
或者如果 Java 版本 8+
我将提供另一种带有流的解决方案
如果您需要 map
Map<String, Integer>,那么在这种情况下,根本不需要字段和age方法,因为equals它们没有被使用。hashCodetoString要将重复的工作表元素收集到地图中,可以使用以下方法
stream.collect:结论: