我想比较两个数组的对象,并获得一个不匹配的对象的新数组。这是: 阵列1 阵列2 都包含带有方法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"}
并输出不匹配的
答案 0 :(得分:1)
如果您已经在使用列表,只需在
的行上使用list1.removeAll(list2)
要进一步优化,如果使用哈希集,则删除操作将变为O(1),因此效率更高
答案 1 :(得分:1)
这只是离散数学的问题。查看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
列表完整并创建包含结果的第三个列表的要求。
答案 2 :(得分:1)
其他显示List::removeAll
的答案,例如the one from Cuga是正确的,最适合简单情况。
我将展示使用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" );
从一个列表创建流。对于流中的每个元素,请查看该元素是否可以为found in the other list。
.filter ( namesB :: contains )
。 .filter ( Predicate.not ( namesB :: contains ) )
该Predicate.not
技巧是Java 11的新功能,如here所示。
将结果收集到新的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 );
结果。
姓名A:[彼得,保罗,玛丽,温迪,丽莎]
姓名B:[彼得,保罗,杰西,温迪,丽莎]
与众不同:[玛丽]
答案 3 :(得分:1)
假设您使用的类称为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);
答案 4 :(得分:1)
您可以使用类似这样的东西。使用此功能,如果将collection1与collection2进行比较,或者将collection2与collection1进行比较,则它们的大小无关紧要。差异应始终相等。
private static <E> List<E> getDiff(Collection<E> collection1, Collection<E> collection2) {
Collection<E> largerOne = collection1.size() >= collection2.size() ? collection1 : collection2;
Collection<E> smallerOne = largerOne == collection1 ? collection2 : collection1;
return largerOne.stream().filter(i -> !smallerOne.contains(i)).collect(Collectors.toList());
}