5 回答
TA贡献1818条经验 获得超7个赞
我想比较两个数组的对象并获得一个不匹配的对象的新数组。这是: Array1 Array2 都包含 Object User 方法 getId 和 getUsername
for (int fw = 0; fw < tempOldArray.size(); fw++) {
for (int fi = 0; fi < tempArray.size(); fi++) {
if (tempOldArray.get(fw).getId() == tempArray.get(fi).getId()) {
match++;
break;
}
if(fi == (tempArray.size()-1)) {
nomatchfound++;
break;
}
}
}
Array1: {[1231, Peter], [2562, Jackson], [38987, Robert], [4765, William]}
Array2: {[2562, Jackson], [7584, Alfred], [38987, Robert], [8123, Mozart]}
Array3 should output {[1231, Peter], [4765, William]}
and Array4 should output {[7584, Alfred], [8123, Mozart]}
还询问了如何从列表中检索结果
{"peter", "trump", "donald", "jerry"}
{"peter", "donald", "lucas", "jerry"}
并输出不匹配的
TA贡献1878条经验 获得超4个赞
如果您已经在使用列表,只需使用以下内容
list1.removeAll(list2)
为了进一步优化,如果您使用哈希集,您的删除操作将变为 O(1),因此效率更高
TA贡献1895条经验 获得超7个赞
这只是离散数学的问题。检查执行情况removeAll():
public static void main(String[] args) {
List<String> first = Arrays.asList("peter", "trump", "donald", "jerry");
List<String> second = Arrays.asList("peter", "donald", "lucas", "jerry");
List<String> results = new ArrayList<>(first);
results.removeAll(second);
System.out.println(results.toString());
}
印刷:
[王牌]
这满足了您对完整保留first和second列表并创建第三个列表以包含结果的要求。
TA贡献1775条经验 获得超11个赞
假设您正在使用的类称为 Person,您必须将以下 equals 方法添加到类定义中
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!Person.class.isAssignableFrom(obj.getClass())) {
return false;
}
final Person other = (Person) obj;
if (this.id != other.id) {
return false;
}
return true;
}
在这种情况下,您可以简单地使用像这样的其他答案中指定的 removeAll 方法。
list1.removeAll(list2);
TA贡献1818条经验 获得超7个赞
显示的其他答案List::removeAll
(例如来自 Cuga 的答案)是正确的,最适合简单的情况。
Java流
我将展示使用 Java 流的更高级的方法。如果您的情况变得更加复杂,您可能想要使用这种方法。
定义您的两个列表。用于List.of
实例化不可修改的列表已添加到 Java 9。
List < String > namesA = List.of ( "Peter" , "Paul" , "Mary" , "Wendy" , "Lisa" ); List < String > namesB = List.of ( "Peter" , "Paul" , "Jesse" , "Wendy" , "Lisa" );
从一个列表创建流。对于流中的每个元素,查看是否可以在另一个列表中找到该元素。
要查找所有匹配项,请使用
.filter ( namesB :: contains )
。要查找所有不匹配的项目(不同的元素),请使用:
.filter ( Predicate.not ( namesB :: contains ) )
这个Predicate.not
技巧是 Java 11 的新技巧,如这里所示。
将结果收集到一个新的List
.
List < String > distinct = namesA.stream () .filter ( Predicate.not ( namesB :: contains ) ) .collect ( Collectors.toList () );
转储到控制台。
System.out.println ( "namesA: " + namesA ); System.out.println ( "namesB: " + namesB ); System.out.println ( "distinct: " + distinct );
结果。
namesA: [Peter, Paul, Mary, Wendy, Lisa]
namesB: [Peter, Paul, Jesse, Wendy, Lisa]
独特的:[玛丽]
添加回答
举报