如果对象的顺序不重要
如果顺序不重要,您可以将列表元素放入 Set
中:
Set<MyObject> mySet = new HashSet<MyObject>(yourList);
重复内容将会被自动删除。
如果对象顺序很重要
如果顺序很重要,那么您可以手动检查重复内容,例如使用以下代码片段:
ArrayList<String> newList = (ArrayList<String>) list.clone();
for (int i = 0; i < list.size(); i++) {
for (int j = list.size() - 1; j >= i; j--) {
if (i == j) {
continue;
}
if (list.get(i).equals(list.get(j))) {
newList.remove(list.get(i));
break;
}
System.out.println("" + i + "," + j + ": " + list.get(i) + "-" + list.get(j));
}
}
这将删除所有重复项,只保留最后一个重复值作为原始条目。此外,它仅检查每个组合一次。
使用Java 8
Java Streams使它变得更加优雅:
List<Integer> newList = oldList.stream()
.distinct()
.collect(Collectors.toList())
如果您需要根据自己的定义将两个对象视为相等,则可以执行以下操作:
public static <T, U> Predicate<T> distinctByProperty(Function<? super T, ?> propertyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(propertyExtractor.apply(t));
}
(by Stuart Marks)
然后你可以这样做:
List<MyObject> newList = oldList.stream()
.filter(distinctByProperty(t -> {
return t.getName().charAt(0);
}))
.collect(Collectors.toList());
此外
在使用 Iterator
(通常在 for-each 循环中使用)遍历数组时,您不能修改列表。这会导致 ConcurrentModificationException
异常。如果您使用 for 循环遍历数组,则可以修改该数组。然后,您必须控制迭代器的位置(在删除条目时将其递减)。