#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)); } } }