Как удалить дубликаты из списка? - PullRequest
55 голосов
/ 17 мая 2010

Я хочу удалить дубликаты из списка, но то, что я делаю, не работает:

List<Customer> listCustomer = new ArrayList<Customer>();    
for (Customer customer: tmpListCustomer)
{
  if (!listCustomer.contains(customer)) 
  {
    listCustomer.add(customer);
  }
 }

Ответы [ 15 ]

1 голос
/ 04 октября 2015

ИМХО лучший способ как это сделать в эти дни:

Предположим, у вас есть коллекция " dups " и вы хотите создать другую коллекцию, содержащую те же элементы, но с удалением всех дубликатов. Следующая строчка делает трюк.

Collection<collectionType> noDups = new HashSet<collectionType>(dups);

Он работает путем создания набора, который по определению не может содержать дубликаты.

Основано на документе оракула. ​​

1 голос
/ 28 ноября 2013

Самый чистый способ:

List<XXX> lstConsultada = dao.findByPropertyList(YYY);
List<XXX> lstFinal = new ArrayList<XXX>(new LinkedHashSet<GrupoOrigen>(XXX));

и переопределить hascode и equals для свойств идентификатора каждой сущности

1 голос
/ 17 мая 2010

Как уже упоминалось, вы, вероятно, неправильно используете equals ().

Однако следует также отметить, что этот код считается довольно неэффективным, поскольку время выполнения может быть числом элементов в квадрате.

Возможно, вы захотите рассмотреть использование структуры Set вместо List или сначала создать Set, а затем превратить его в список.

0 голосов
/ 09 октября 2017

Использование java 8 stream api.

    List<String> list = new ArrayList<>();
    list.add("one");
    list.add("one");
    list.add("two");
    System.out.println(list);
    Collection<String> c = list.stream().collect(Collectors.toSet());
    System.out.println(c);

Выход:

До значений: [один, один, два]

После значений: [один, два]

0 голосов
/ 17 мая 2010

Правильный ответ для Java - использовать Set . Если у вас уже есть List<Customer> и вы хотите скопировать его

Set<Customer> s = new HashSet<Customer>(listCustomer);

В противном случае просто используйте Set реализацию HashSet, TreeSet напрямую и пропустите этап построения List.

Вам нужно будет переопределить hashCode() и equals() для классов вашего домена, которые также помещены в Set, чтобы убедиться, что поведение, которое вы хотите, действительно соответствует вашему. equals() может быть таким же простым, как сравнение уникальных идентификаторов объектов, и таким же сложным, как сравнение каждого поля. hashCode() может быть так же просто, как вернуть hashCode() представления уникального идентификатора 'String или hashCode().

...