如何从列表/数组中检索不匹配的结果

时间:2019-07-05 18:30:35

标签: java

我想比较两个数组的对象,并获得一个不匹配的对象的新数组。这是: 阵列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"}

并输出不匹配的

5 个答案:

答案 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());
}

打印:

[王牌]

这可以满足您保留firstsecond列表完整并创建包含结果的第三个列表的要求。

答案 2 :(得分:1)

其他显示List::removeAll的答案,例如the one from 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" );

从一个列表创建流。对于流中的每个元素,请查看该元素是否可以为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());
}