如何在 java 中的对象列表中查找重复项
How to find duplicates in a list of list of objects in java
假设我在对象数组列表中有一个数据compositeKeyValues = [["READ", "3GPP_ACCESS"], ["CREATE", "NON_3GPP"], ["READ", "3GPP_ACCESS"], ["MODIFY", "NON_3GPP"]]
List<Object> compositeKeyValues = new ArrayList<>();
我想识别外部列表中的重复列表,它包含相同的值,例如在索引 0 和 2 处,列表是相同的。我怎样才能在列表中识别出类似的东西?
我会首先不列出通用 Object
实例,因为这会使完成它变得更加困难。改为将对象列表设为特定的 class。然后,您的自定义 class 必须覆盖对象的 equal()
和 hashCode()
方法。
现在的问题是,如何最简单地完成实际删除重复项的方法。简单的答案是将您的 List
转换为 Set
。我认为这样的事情应该可行。
Set<SomeType> mySet = myList.findByType(type)
.stream()
.map(ClassName::getValue)
.collect(Collectors.toSet());
请记住,我提到的方法仍然需要重写。大多数(如果不是全部的话)现代 IDE 都有方便的方法来覆盖 equals()
和 hashCode()` 方法。
实际上,您有:
List<List<String>> compositeKeyValues;
如果列表具有相同顺序的相同元素,则列表是相等的 - 就像您的示例。
查找重复的内部列表与查找其他更简单类型的重复没有什么不同。
这是一种方法:
List<List<String>> duplicates = compositeKeyValues.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.filter(e -> e.getValue().intValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
即使您将列表的类型保留为 List<Object>
,此代码也能正常工作,只是结果的类型也会是 List<Object>
。但是,建议使用更具体的类型 List<List<String>>
.
,而且更 有用
试试这个:
java.util.List<String> list = Arrays.asList("READ", "3GPP_ACCESS","CREATE", "NON_3GPP","READ", "3GPP_ACCESS","MODIFY", "NON_3GPP");
for (int i = 0; i < list.size(); i++) {
for (int j = i+1; j <list.size() ; j++) {
if(list.get(i).equals(list.get(j))){
System.out.println(list.get(i));
}
}
}
我想贡献一个基于数组的解决方案,即使最初的问题是关于列表的。
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 < data.length; i++)
for (int j = i + 1; j < 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]));
}
}
}
假设我在对象数组列表中有一个数据compositeKeyValues = [["READ", "3GPP_ACCESS"], ["CREATE", "NON_3GPP"], ["READ", "3GPP_ACCESS"], ["MODIFY", "NON_3GPP"]]
List<Object> compositeKeyValues = new ArrayList<>();
我想识别外部列表中的重复列表,它包含相同的值,例如在索引 0 和 2 处,列表是相同的。我怎样才能在列表中识别出类似的东西?
我会首先不列出通用 Object
实例,因为这会使完成它变得更加困难。改为将对象列表设为特定的 class。然后,您的自定义 class 必须覆盖对象的 equal()
和 hashCode()
方法。
现在的问题是,如何最简单地完成实际删除重复项的方法。简单的答案是将您的 List
转换为 Set
。我认为这样的事情应该可行。
Set<SomeType> mySet = myList.findByType(type)
.stream()
.map(ClassName::getValue)
.collect(Collectors.toSet());
请记住,我提到的方法仍然需要重写。大多数(如果不是全部的话)现代 IDE 都有方便的方法来覆盖 equals()
和 hashCode()` 方法。
实际上,您有:
List<List<String>> compositeKeyValues;
如果列表具有相同顺序的相同元素,则列表是相等的 - 就像您的示例。
查找重复的内部列表与查找其他更简单类型的重复没有什么不同。
这是一种方法:
List<List<String>> duplicates = compositeKeyValues.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.filter(e -> e.getValue().intValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
即使您将列表的类型保留为 List<Object>
,此代码也能正常工作,只是结果的类型也会是 List<Object>
。但是,建议使用更具体的类型 List<List<String>>
.
试试这个:
java.util.List<String> list = Arrays.asList("READ", "3GPP_ACCESS","CREATE", "NON_3GPP","READ", "3GPP_ACCESS","MODIFY", "NON_3GPP");
for (int i = 0; i < list.size(); i++) {
for (int j = i+1; j <list.size() ; j++) {
if(list.get(i).equals(list.get(j))){
System.out.println(list.get(i));
}
}
}
我想贡献一个基于数组的解决方案,即使最初的问题是关于列表的。
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 < data.length; i++)
for (int j = i + 1; j < 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]));
}
}
}