【问题标题】:Finding similar but not equal entities across two lists (Java) [duplicate]在两个列表中查找相似但不相等的实体(Java)[重复]
【发布时间】:2020-09-01 20:42:54
【问题描述】:

假设我有一个像这样的“人”类:

public class Person {
   String name;
   int age;
   String address;
   // Getters and Setters etc.
}

我有两个“人员”列表:一个要创建的列表和一个要删除的列表。

删除列表 =

[
   {
       "name: "David"
       "age": 30,
       "address": "10 Main St."
   },
   {
       "name: "Mary"
       "age": 31,
       "address": "8 Main St."
   },
   {
       "name: "John"
       "age": 40,
       "address": "9 Side St."
   }
]

创建列表 =

[
   {
       "name: "David"
       "age": 30,
       "address": "50 Fleet St."
   },
   {
       "name: "Oliver"
       "age": 31,
       "address": "40 10th St."
   },
   {
       "name: "Jane"
       "age": 40,
       "address": "1 Broadway"
   }
]

我想获得一对(或一对列表),其中 LHS 和 RHS 中的名称和年龄相同,但地址不同。这个想法是我有一个要删除的实体列表和要创建的实体列表,但在David 的情况下,我不想删除实体并创建一个新实体,因为它存在依赖关系。我只是想改变他的地址。

Person 中没有唯一标识符,所以我不能只通过 id 进行比较。

【问题讨论】:

  • 大卫刚刚换了地址吗?或者有两个大卫吗? 如何区分?
  • 如果您没有每个人的唯一标识符(如 ID),您将无法知道它们是相同的 - 假设您获得的列表是 JSON 格式而不是已经存在的,这是正确的将每个加载到 person 类中。
  • 这能回答你的问题吗? Java 8: check for common elements in two lists using streams。投票最多的答案的第二种方法使用比较器,这是您想要使用的 - 使用姓名和年龄。
  • @JonnyHenly 我想得到一对(或一对列表),其中 LHS 和 RHS 中的名称和年龄相同,但地址不同。这个想法是我有一个要删除的实体列表和要创建的实体列表,但在David 的情况下,我不想删除实体并创建一个新实体,因为它存在依赖关系。我只是想改变他的地址。
  • @ShimonCohen 这就是问题所在,我没有此类的标识符。另外,请忽略我的问题中的列表以 json 表示。我只是认为这将是表示数据的最简单方法。我这里只处理 Java 对象。

标签: java collections java-stream


【解决方案1】:

在现实世界中,您没有足够的信息来确定记录是另一个人还是只是地址更改。

如果你在一个玩具环境中玩,你永远不会遇到两个同名同龄的人,那么 THAT(姓名和年龄)是你的复合主键,你可以写一个基于 hashCode()equals()在那。在这种情况下,这是 Java 8: check for common elements in two lists using streams

的副本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多