【问题标题】:how to compare 2 List<Entity>? [duplicate]如何比较 2 List<Entity>? [复制]
【发布时间】:2019-07-04 07:10:05
【问题描述】:

我有 2 个列表实体,如果可能的话,我不想通过嵌套循环来比较它,

假设我有这样的实体:

List<Entity1> = entity1Repository.findByCode(String code);
List<Entity2> = entity2Repository.findByName(String name);

我想比较那些实体,我想要列表的结果,该列表的唯一值具有相同的值,

比如这个=[1, 2, 4][1,2,5] 我想要这样的结果 ==> [1,2]

如何在 Java 中做到这一点?

【问题讨论】:

  • 如果 Entity1 和 Entity2 没有共同的超类型(Emtkty 接口),您可以在下面的答案中使用 Object 并且必须编写一个静态辅助函数来提取和比较值 static boolean isSameEntityValue(Entity1 es, Entity2 e2)

标签: java


【解决方案1】:

您可以编写一个函数,该函数返回一个列表,其中包含作为参数传递的 2 个列表的相交元素:

public <T> List<T> intersection(List<T> list1, List<T> list2) {
        List<T> list = new ArrayList<T>();

        for (T t : list1) {
            if(list2.contains(t)) {
                list.add(t);
            }
        }

        return list;
    }

【讨论】:

  • 公开&lt;T&gt;是什么意思?
【解决方案2】:

假设输入:

List<Integer> l1 = Arrays.asList(1, 2, 3, 4);
List<Integer> l2 = Arrays.asList(11, 2, 5, 4);

列举两种方式:

    //method 1
    List<Integer> result = l1.stream().filter(l2::contains).collect(Collectors.toList());
    System.out.println(result);

    //method 2
    Set<Integer> s1 = new HashSet<>(l1);
    s1.retainAll(l2);

    System.out.println(s1);
    System.out.println(l1);

在方法 1 中:您正在使用流,这是一个来自 java 的绝妙概念

在方法 2 中:您正在创建另一个集合,并在其上调用 retainAll()。这将从 s1 中删除其他元素,但不会影响原始列表 l1。

【讨论】:

  • 它是否也可以在 List 和 List 中使用?因为您的示例是 List,所以我对 Java 还是很陌生
  • 你的类:“实体”必须至少有方法:@Override public boolean equals(Object obj) {...}
  • 你能举例说明如何在实体上写这个吗?我试过了,但还是不明白,现在韩国
【解决方案3】:

您可以使用 Java 8 Stream api 从两个列表中获取公共元素。

List<Entity> commonEntity = entity1.stream() .filter(entity2::contains) .collect(Collectors .toList()));

【讨论】:

  • 我应该在 List commonEntity 上写其中一个实体吗??
  • 它应该是您要比较的元素的类型。例如:如果您比较两个字符串类型的列表,结果列表类型将是字符串。
猜你喜欢
  • 2012-03-25
  • 1970-01-01
  • 2016-07-09
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2012-03-25
相关资源
最近更新 更多