为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ITMISS 2023-03-09 11:31:24
我想比较两个数组的对象并获得一个不匹配的对象的新数组。这是: 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"}并输出不匹配的
查看完整描述

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"}

并输出不匹配的


查看完整回答
反对 回复 2023-03-09
?
UYOU

TA贡献1878条经验 获得超4个赞

如果您已经在使用列表,只需使用以下内容

list1.removeAll(list2)

为了进一步优化,如果您使用哈希集,您的删除操作将变为 O(1),因此效率更高


查看完整回答
反对 回复 2023-03-09
?
人到中年有点甜

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列表并创建第三个列表以包含结果的要求。


查看完整回答
反对 回复 2023-03-09
?
繁星淼淼

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


查看完整回答
反对 回复 2023-03-09
?
qq_笑_17

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]

独特的:[玛丽]


查看完整回答
反对 回复 2023-03-09
  • 5 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信