Если порядок объектов незначителен
Если порядок не важен, вы можете поместить элементы списка в Set
:
Set<MyObject> mySet = new HashSet<MyObject>(yourList);
Дубликаты будут удалены автоматически.
Если порядок объектов значителен
Если порядок значим, вы можете вручную проверить наличие дубликатов, например, используя этот фрагмент:
// Copy the list.
ArrayList<String> newList = (ArrayList<String>) list.clone();
// Iterate
for (int i = 0; i < list.size(); i++) {
for (int j = list.size() - 1; j >= i; j--) {
// If i is j, then it's the same object and don't need to be compared.
if (i == j) {
continue;
}
// If the compared objects are equal, remove them from the copy and break
// to the next loop
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));
}
( Stuart Marks )
И тогда вы можете сделать это:
List<MyObject> newList = oldList.stream()
.filter(distinctByProperty(t -> {
// Your custom property to use when determining whether two objects
// are equal. For example, consider two object equal if their name
// starts with the same character.
return t.getName().charAt(0);
}))
.collect(Collectors.toList());
Futhermore
Вы не можете изменять список, пока Iterator
(который обычно используется в цикле for-each) просматривает массив.Это бросит ConcurrentModificationException
.Вы можете изменить массив, если зацикливаете его, используя цикл for.Затем вы должны контролировать положение итератора (уменьшая его при удалении записи).