Как найти дубликаты в списке списка объектов в java

#java #list #object #arraylist #duplicates

#Ява #Список #объект #список объектов #дубликаты

Вопрос:

Допустим, у меня есть данные в списке объектов массива compositeKeyValues = [["READ", "3GPP_ACCESS"], ["CREATE", "NON_3GPP"], ["READ", "3GPP_ACCESS"], ["MODIFY", "NON_3GPP"]]

 Listlt;Objectgt; compositeKeyValues = new ArrayListlt;gt;();  

Я хочу идентифицировать дублированный список внутри этого внешнего списка, который содержит одинаковые значения, например, при индексе 0 и 2 списки идентичны. Как я могу идентифицировать что-то подобное в списке?

Ответ №1:

На самом деле, у вас есть:

 Listlt;Listlt;Stringgt;gt; compositeKeyValues;  

Списки равны, если они содержат одни и те же элементы в одном и том же порядке, как в вашем примере.

Поиск дубликатов внутренних списков ничем не отличается от поиска дубликатов других более простых типов.

Вот один из способов:

 Listlt;Listlt;Stringgt;gt; duplicates = compositeKeyValues.stream()  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))  .entrySet().stream()  .filter(e -gt; e.getValue().intValue() gt; 1)  .map(Map.Entry::getKey)  .collect(Collectors.toList());  

Этот код будет работать , даже если вы оставите тип списка как Listlt;Objectgt; , за исключением того, что результат также будет иметь тип Listlt;Objectgt; . Однако рекомендуется и более полезно использовать более конкретный тип Listlt;Listlt;Stringgt;gt; .

Комментарии:

1. Хотя и не рекомендуется использовать Listlt;Objectgt; . Listlt;Listlt;Stringgt;gt; это правильный путь.

2. еще один вопрос: каковы точные инструкции импорта, используемые здесь для использования методов группировки по , идентификации() и подсчета ()?

3. @misbhaafreen Я добавил имена классов в код, чтобы сделать его более понятным. Воспользуйся import java.util.function.Function; import java.util.stream.Collectors; . Вы можете использовать x -gt; x вместо Function.identity() .

Ответ №2:

Я бы начал с того, что не стал составлять список универсальных Object экземпляров, потому что это значительно усложнит его выполнение. Вместо этого составьте список объектов определенного класса. Затем ваш пользовательский класс должен переопределить объекты equal() и hashCode() методы.

Теперь вопрос в том, как проще всего выполнить фактическое удаление дубликатов. Простой ответ состоит в том, чтобы преобразовать ваш List в a Set . Я думаю, что что-то подобное должно сработать.

 Setlt;SomeTypegt; mySet = myList.findByType(type)  .stream()  .map(ClassName::getValue)  .collect(Collectors.toSet());  

Имейте в виду, что методы, о которых я упоминал, все равно нужно будет переопределить. Большинство, если не все, современных IDE имеют удобные методы переопределения equals() и методы хэш-кода ().

Комментарии:

1. я попытался сравнить размер списка и набора, но набор не устраняет их, и здесь все динамично, поэтому я не думаю, что смогу сделать из этого какой-либо конкретный класс.

2. @misbhaafreen Вы переопределили equals и hashCode из Object класса? Я предполагаю, что ты этого не сделал. Если вы не переопределите эти методы, не будет возможности определить, идентичны ли два разных объекта по внутренним значениям. Таким образом, они не будут найдены и впоследствии удалены.

Ответ №3:

Я хотел предложить решение на основе массива, даже если первоначальный вопрос касался списков.

 import java.util.Arrays;  public class Main {   public static void main(String[] args) {   String[][] data = { { "READ", "3GPP_ACCESS" }, { "CREATE", "NON_3GPP" }, { "READ", "3GPP_ACCESS" },  { "MODIFY", "NON_3GPP" } };   for (int i = 0; i lt; data.length; i  )  for (int j = i   1; j lt; data.length; j  ) {// should not compare with itself and anything previously else  // there will be double findings like 0,2 and 2,0   if (Arrays.equals(data[i], data[j])) // check for equality   System.out.println("Match found at "   i   " "   Arrays.toString(data[i])   " and "   j   " "    Arrays.toString(data[j]));   }  }  }  

Ответ №4:

Попробуйте это:

 java.util.Listlt;Stringgt; list = Arrays.asList("READ", "3GPP_ACCESS","CREATE", "NON_3GPP","READ", "3GPP_ACCESS","MODIFY", "NON_3GPP");  for (int i = 0; i lt; list.size(); i  ) {  for (int j = i 1; j lt;list.size() ; j  ) {  if(list.get(i).equals(list.get(j))){  System.out.println(list.get(i));  }  }  }