当前位置: 首页 > 知识库问答 >
问题:

从两个列表中的差异创建新列表[重复]

岳亮
2023-03-14

我有一个带有Person对象的数据库表。我的网络服务接收一个Person对象列表来更新这个Person表。我的应用程序现在包含两个列表:

List<Person> current;
List<Person> updated;

我想遍历这些列表,并创建一个新列表,用于更新Person表。

Person {
   String fName;
   String lName;
   String age;       
   String email;
}

fName和lName用于识别现有记录。下面是一个例子。

现在的

乔,布洛格斯,18岁,joe@me.com
简,布洛格斯,21岁,jane@me.com
弗洛,布洛格斯,25岁,flo@me.com

新的

乔,布洛格斯,18岁,乔_bloggs@me.com
简,布洛格斯,21岁,jane@me.com
弗洛,布洛格斯,90岁,flo@me.com

用于更新数据库的记录

Joe, Bloggs,18,joe_bloggs@me.com
Flo, Bloggs,90,flo@me.com

    private newList(List<Person> current, List<Person> new) {
      List<Person> toUpdate = new ArrayList();
      for(Person person : new) {
         Person found = current.stream().filter(p->p.equals(person)).findFirst().orElse(person);
      if (found.age!=person.age OR found.email!=person.email) {
         toUpdate.add(person);
      }
      return toUpdate;
    }

共有1个答案

翟光赫
2023-03-14

除非您在Person类中重写equals方法来实际检查字段,否则您需要检查对象的值,而不是引用。这里有一个例子,假设lname和fname用于标识记录。此外,对于相同的记录,我们不必将它们添加到列表中,这样我们的筛选方法将返回一个空对象,以处理我们可以使用可选的。

更有效的方法是创建一个HashMap,将fname和lname作为键,将人对象作为值,这样你就不必一次又一次地过滤,从而将运行时间减少了n倍。

   private newList(List<Person> old, List<Person> updated) {
      List<Person> toUpdate = new ArrayList<Person>();
      for(Person person : old) {
          
         Optional<Person> found = 
                  updated
                  .stream()
                  .filter(p-> p.fname == person.fname 
                          && p.lname == person.lname && 
                             (p.email != person.email 
                          || p.age != person.age)).findFirst();
         
         if(found.isPresent()) {
             Person f = found.get();
             toUpdate.add(f);
         }
     }
         return toUpdate;
         
  }
 类似资料:
  • 问题内容: 我有两个清单,和。我需要的物品不在其中。 我只想得到[4,5]-l1中只有新值。 我可以不用迭代吗? 问题答案: 简短的回答,是的:,但这不会保持秩序。 长答案,不,因为在内部CPU总是会迭代。但如果你使用的是迭代将进行高度优化,并会快那么你的列表解析(更不用说检查会员是 多 快带套然后列出)。

  • 我有一个列表,我想创建一个名为的扩展。 我不想覆盖,因此不能使用append、extend或insert。我想知道是否有一个快速的方法来完成这项工作(比使用理解列表或Deep.copy更快)

  • 我正在尝试使用Java8流来组合列表。如何从两个现有列表中获得“对称差异列表”(只存在于一个列表中的所有对象)。我知道如何获取intersect列表,也知道如何获取union列表。 示例代码:

  • 问题内容: 我正在尝试创建一个包含2个列表并返回仅具有两个列表差异的列表的函数。 例: 结果应打印 到目前为止的功能: 第一个for循环将其排序,第二个将重复项删除。问题是结果 不是,所以不能完全删除重复项吗?我可以添加些什么来做到这一点。我不能使用任何特殊模块,.sort,set或其他任何东西,而只是基本地循环。 问题答案: 基本上,您希望将一个元素添加到新列表中(如果一个元素存在而另一个元素中

  • 问题内容: 我有两个列表,其中包含许多相同的项目,包括重复的项目。我想检查第一个列表中的哪些项不在第二个列表中。例如,我可能有一个这样的列表: 还有一个像这样的列表: 比较这两个列表,我想返回第三个列表,如下所示: 我目前正在使用一些我之前确定的糟糕代码,我可以肯定它甚至无法正常工作,如下所示。 我怎样才能更好地完成这项任务? 问题答案: 您没有指定订单是否重要。如果没有,则可以在> = Pyth