Удаление повторяющихся значений из ArrayList

У меня есть один Arraylist String, и я добавил в него некоторое дублирующее значение. и я просто хочу удалить это дублирующее значение. Так как его удалить.

Здесь в примере у меня есть одна идея.

List list = new ArrayList(); list.add("Krishna"); list.add("Krishna"); list.add("Kishan"); list.add("Krishn"); list.add("Aryan"); list.add("Harm"); System.out.println("List"+list); for (int i = 1; i < list.size(); i++) { String a1 = list.get(i); String a2 = list.get(i-1); if (a1.equals(a2)) { list.remove(a1); } } System.out.println("List after short"+list); 

Но есть ли Достаточный способ удалить этот список дубликатов. без использования цикла For? И я могу это сделать, используя HashSet или каким-либо другим способом, но используя список массивов. хотел бы предложить ваше предложение. благодарю вас за ваш ответ заранее.

Вы можете создать LinkedHashSet из списка. LinkedHashSet будет содержать каждый элемент только один раз и в том же порядке, что и List . Затем создайте новый List из этого LinkedHashSet . Так эффективно, это однострочный:

 list = new ArrayList(new LinkedHashSet(list)) 

Любой подход, включающий List#contains или List#remove , вероятно, уменьшит асимптотическое время работы от O (n) (как в приведенном выше примере) до O (n ^ 2).


EDIT Для требования, упомянутого в комментарии: если вы хотите удалить повторяющиеся элементы, но считайте Strings равным, игнорируя случай, тогда вы можете сделать что-то вроде этого:

 Set toRetain = new TreeSet(String.CASE_INSENSITIVE_ORDER); toRetain.addAll(list); Set set = new LinkedHashSet(list); set.retainAll(new LinkedHashSet(toRetain)); list = new ArrayList(set); 

Он будет иметь время работы O (n * logn), которое все же лучше, чем многие другие параметры. Обратите внимание, что это выглядит немного сложнее, чем могло бы быть: я предположил, что порядок элементов в списке не может быть изменен. Если порядок элементов в списке не имеет значения, вы можете просто сделать

 Set set = new TreeSet(String.CASE_INSENSITIVE_ORDER); set.addAll(list); list = new ArrayList(set); 

если вы хотите использовать только arraylist, то я беспокоюсь, что нет лучшего способа, который создаст огромную выгоду в производительности. Но только используя arraylist, который я проверил бы перед добавлением в список, как показано ниже

 void addToList(String s){ if(!yourList.contains(s)) yourList.add(s); } 

В этом случае подходящим является использование набора.

Вы можете использовать утилиты Google Guava, как показано ниже

  list = ImmutableSet.copyOf(list).asList(); 

Это, пожалуй, самый эффективный способ устранения дубликатов из списка и, что интересно, он также сохраняет итерационный порядок.

ОБНОВИТЬ

Но в случае, если вы не хотите включать Guava, дубликаты могут быть удалены, как показано ниже.

 ArrayList list = new ArrayList(); list.add("Krishna"); list.add("Krishna"); list.add("Kishan"); list.add("Krishn"); list.add("Aryan"); list.add("Harm"); System.out.println("List"+list); HashSet hs = new HashSet(); hs.addAll(list); list.clear(); list.addAll(hs); 

Но, конечно, это разрушит порядок итераций элементов в ArrayList.

Шишир

Функция streamа Java 8

Вы можете использовать определенную функцию, как указано выше, для получения отдельных элементов списка,

 stringList.stream().distinct(); 

Из документации,

Возвращает stream, состоящий из отдельных элементов (в соответствии с Object.equals (Object)) этого streamа.


Другой способ, если вы не хотите использовать метод equals, – это использовать такую ​​функцию сбора ,

 stringList.stream() .collect(Collectors.toCollection(() -> new TreeSet((p1, p2) -> p1.compareTo(p2)) )); 

Из документации,

Выполняет изменчивую операцию сокращения элементов этого streamа с использованием Collector.

Надеюсь, это поможет.

 List list = new ArrayList(); list.add("Krishna"); list.add("Krishna"); list.add("Kishan"); list.add("Krishn"); list.add("Aryan"); list.add("Harm"); HashSet hs=new HashSet<>(list); System.out.println("=========With Duplicate Element========"); System.out.println(list); System.out.println("=========Removed Duplicate Element========"); System.out.println(hs); 

Я не думаю, что list = new ArrayList(new LinkedHashSet(list)) не самый лучший способ, так как мы используем LinkedHashset (мы могли бы использовать напрямую LinkedHashset вместо ArrayList )

Решение:

 import java.util.ArrayList; public class Arrays extends ArrayList{ @Override public boolean add(Object e) { if(!contains(e)){ return super.add(e); }else{ return false; } } public static void main(String[] args) { Arrays element=new Arrays(); element.add(1); element.add(2); element.add(2); element.add(3); System.out.println(element); } } 

Выход: [1, 2, 3]

Здесь я расширяю ArrayList , поскольку я использую его с некоторыми изменениями, переопределяя метод add .

Простая функция удаления дубликатов из списка

 private void removeDuplicates(List list) { int count = list.size(); for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { if (list.get(i).equals(list.get(j))) { list.remove(j--); count--; } } } } 

Пример:
Вход: [1, 2, 2, 3, 1, 3, 3, 2, 3, 1, 2, 3, 3, 4, 4, 4, 1]
Выход: [1, 2, 3, 4]

Это будет лучший способ

  List list = new ArrayList(); list.add("Krishna"); list.add("Krishna"); list.add("Kishan"); list.add("Krishn"); list.add("Aryan"); list.add("Harm"); Set set=new HashSet<>(list); 

Лучше использовать HastSet

1-a) HashSet содержит набор объектов, но позволяет легко и быстро определить, находится ли объект в наборе или нет. Он делает это, внутренне управляя массивом и сохраняя объект, используя индекс, который вычисляется из hash-кода объекта. Взгляните сюда

1-b) HashSet – это неупорядоченная коллекция, содержащая уникальные элементы. Он имеет стандартные операции коллекции Add, Remove, Contains, но поскольку он использует hash-реализацию, эти операции O (1). (В отличие от List, например O (n) для Contains и Remove.) HashSet также предоставляет стандартные операции набора, такие как объединение, пересечение и симметричная разность. Посмотрите здесь

2) Существуют различные реализации наборов. Некоторые делают операции ввода и поиска сверхбыстрыми элементами hashирования. Однако это означает, что порядок, в котором были добавлены элементы, теряется. Другие реализации сохраняют добавленный заказ за счет более медленного времени работы.

Класс HashSet в C # идет для первого подхода, не сохраняя при этом порядок элементов. Это намного быстрее обычного списка. Некоторые базовые тесты показали, что HashSet прилично быстрее работает с первичными типами (int, double, bool и т. Д.). Это намного быстрее при работе с объектами classа. Итак, дело в том, что HashSet работает быстро.

Единственный улов HashSet – отсутствие доступа по индексам. Для доступа к элементам вы можете либо использовать перечислитель, либо использовать встроенную функцию для преобразования HashSet в список и итерации через это. Посмотрите здесь

Без петли, Нет ! Поскольку ArrayList индексируется по порядку, а не по ключу, вы не можете найти целевой элемент без повторения всего списка.

Хорошей практикой программирования является выбор правильной структуры данных в соответствии с вашим сценарием. Поэтому, если Set наиболее подходит для вашего сценария, обсуждение его реализации со List и попытка найти самый быстрый способ использования ненадлежащей структуры данных не имеет смысла.

  public List removeDuplicates(List list) { // Set set1 = new LinkedHashSet(list); Set set = new TreeSet(new Comparator() { @Override public int compare(Object o1, Object o2) { if(((Contact)o1).getId().equalsIgnoreCase(((Contact)2).getId()) ) { return 0; } return 1; } }); set.addAll(list); final List newList = new ArrayList(set); return newList; } 
 public static void main(String[] args) { @SuppressWarnings("serial") List lst = new ArrayList() { @Override public boolean add(Object e) { if(!contains(e)) return super.add(e); else return false; } }; lst.add("ABC"); lst.add("ABC"); lst.add("ABCD"); lst.add("ABCD"); lst.add("ABCE"); System.out.println(lst); } 

Это лучший способ

list = list.stream().distinct().collect(Collectors.toList());
Это может быть одно из решений, использующих Java8 Stream API. Надеюсь это поможет.

Использование java 8:

 public static  List removeDuplicates(List list) { return list.stream().collect(Collectors.toSet()).stream().collect(Collectors.toList()); } 

Если вам просто нужно удалить дубликаты, используя только ArrayList, других classов Collection, то: –

 //list is the original arraylist containing the duplicates as well List uniqueList = new ArrayList(); for(int i=0;i 

Надеюсь это поможет!

 private static void removeDuplicates(List list) { Collections.sort(list); int count = list.size(); for (int i = 0; i < count; i++) { if(i+1 
 public static List removeDuplicateElements(List array){ List temp = new ArrayList(); List count = new ArrayList(); for (int i=0; i0;i--) { array.remove(i); } return array; } } 
Давайте будем гением компьютера.