如何比较java中的两个列表对象?

如何比较java中的两个列表对象?,java,collections,Java,Collections,我写代码从网站上抓取所有信息。我希望在筛选并保存到数据库时,筛选的数据不包含数据库。若包含数据库,我不想保存它(“因为它是重复的”)。我写代码如下: @Data @Entity public class PostFeedItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(name = "link_profile") private

我写代码从网站上抓取所有信息。我希望在筛选并保存到数据库时,筛选的数据不包含数据库。若包含数据库,我不想保存它(“因为它是重复的”)。我写代码如下:

@Data
@Entity
public class PostFeedItem {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(name = "link_profile")
    private String linkProfile;
    @Column(name = "link_image")
    private String linkImage;
    @Column(name = "full_name")
    private String fullName;
    @Column(name = "content_title")
    private String contentTitle;
    @Column(name = "time_published")
    private String timePublished;
    @Column(name = "number_view")
    private String numberView;
    @Column(name = "number_comment")
    private String numberComment;
    @Column(name = "number_clip")
    private String numberClip;
    @Column(name = "point")
    private String points;
    @ElementCollection
    @CollectionTable(name = "tags", joinColumns = @JoinColumn(name = "tag_id"))
    @Column(name = "tags_post")
    private List<String> tags = new ArrayList<>();
}
@数据
@实体
公共类后馈项目{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“link\u profile”)
私有字符串链接配置文件;
@列(name=“link\u image”)
私有字符串链接图像;
@列(name=“全名”)
私有字符串全名;
@列(name=“content\u title”)
私有字符串contentTitle;
@列(name=“发布时间”)
私有字符串已发布;
@列(name=“number\u视图”)
私有字符串numberView;
@列(name=“number\u comment”)
私有字符串numberComment;
@列(name=“number\u clip”)
私有字符串编号;
@列(name=“point”)
私有字符串点;
@元素集合
@CollectionTable(name=“tags”,joinColumns=@JoinColumn(name=“tag\u id”))
@列(name=“tags\u post”)
private List tags=new ArrayList();
}
现在我使用以下方法从数据库中获取所有数据:

public Iterable<PostFeedItem> findAllPostFeedItemInDatabase() {
        return postFeedItemRepository.findAll();
    }
public Iterable findAllPostFeedItemInDatabase(){
返回postFeedItemRepository.findAll();
}
我有一个列表listPostFieldItems,我想与postFeedItemInDatabase进行比较。如果listPostFieldItems中的任何元素与postFeedItemInDatabase中的任何元素匹配,我不想保存它。如果不匹配,我保存它。我写代码如下:

    List<PostFeedItem> postFeedItemInDatabase = (List<PostFeedItem>) findAllPostFeedItemInDatabase();
    if(!postFeedItemInDatabase.isEmpty()) {
        for (int i = 0; i < listPostFieldItems.size(); i++) {
            for (int j = i+1; j < postFeedItemInDatabase.size(); j++) {
                if((listPostFieldItems.get(i).getContentTitle().equals(postFeedItemInDatabase.get(j).getContentTitle()))) {
                    postFeedItemRepository.save(listPostFieldItems.get(i));
                }
            }
        }
    } else  {
        listPostFieldItems.forEach(postFeedItem -> {
           postFeedItemRepository.save(postFeedItem);
       });
    }
List postfeedindatabase=(List)findallpostfeedindatabase();
如果(!postFeedItemInDatabase.isEmpty()){
对于(int i=0;i{
postFeedItemRepository.save(postFeedItem);
});
}
但它没有起作用。我有个问题。如何将
列表PostFieldItems
列表ItemFromDatabase
进行比较,并保存
列表PostFieldItems
中的所有对象,如果
列表PostFieldItems
中的任何元素不匹配
列表PostFieldItems

1)将列表转换为java.util.concurrent.copyonWriterraylist; 2) 迭代你的列表; 3) 如果有任何元素不匹配,请将对象添加到列表中。

1)将列表转换为java.util.concurrent.CopyOnWriteArrayList; 2) 迭代你的列表;
3) 如果有任何元素不匹配,请将对象添加到列表中。

您的代码是错误的,因为它应该使用索引
j
,并且您应该以不同的方式构建循环,这里是您有一个匹配项,因此在DB中存在一条记录,如果保存,则需要相反的结果

有更简单的方法,对于两者,我建议首先保留一个
contentTitle
列表,因为它是查找匹配/不匹配的关键

List<String> allTitles = postFeedItemInDatabase.stream().map(PostFeedItem::getContentTitle).collect(Collectors.toList());
  • 或者,保留那些不匹配的

    listPostFieldItems = listPostFieldItems.stream().filter(elt -> !allTitles.contains(elt.contentTitle)).collect(Collectors.toList());
    listPostFieldItems.forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
    
  • 康考特行动

    listPostFieldItems.stream()
                      .filter(elt -> !allTitles.contains(elt.contentTitle))
                      .forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
    

  • 您的代码是错误的,因为它应该使用索引
    j
    ,并且您应该以不同的方式构建循环,这里是您有一个匹配项,因此在DB中存在一个记录,如果保存,则需要相反的结果

    有更简单的方法,对于两者,我建议首先保留一个
    contentTitle
    列表,因为它是查找匹配/不匹配的关键

    List<String> allTitles = postFeedItemInDatabase.stream().map(PostFeedItem::getContentTitle).collect(Collectors.toList());
    
  • 或者,保留那些不匹配的

    listPostFieldItems = listPostFieldItems.stream().filter(elt -> !allTitles.contains(elt.contentTitle)).collect(Collectors.toList());
    listPostFieldItems.forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
    
  • 康考特行动

    listPostFieldItems.stream()
                      .filter(elt -> !allTitles.contains(elt.contentTitle))
                      .forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
    

  • 我认为你的源代码有两个问题

  • 对于循环
    postfeedindatabase
    必须从0开始,而不是从i+1开始

  • 如果条件
    listPostFieldItems.get(i).getContentTitle().equals(postFeedItemInDatabase.get(i).getContentTitle())
    看起来很奇怪

    • 条件
      不等于
      。如果
      listPostFieldItems
      中的项与
      postFeedItemInDatabase
      ->save()中的项不相等
    • postfeedindatabase.get(j)
      而不是
      postfeedindatabase.get(i)

  • 我认为你的源代码有两个问题

  • 对于循环
    postfeedindatabase
    必须从0开始,而不是从i+1开始

  • 如果条件
    listPostFieldItems.get(i).getContentTitle().equals(postFeedItemInDatabase.get(i).getContentTitle())
    看起来很奇怪

    • 条件
      不等于
      。如果
      listPostFieldItems
      中的项与
      postFeedItemInDatabase
      ->save()中的项不相等
    • postfeedindatabase.get(j)
      而不是
      postfeedindatabase.get(i)

  • return(list1.size()==list2.size())和&list1.containsAll(list2);需要一种比较列表中对象的方法。

    返回(list1.size()==list2.size())和&list1.containsAll(list2);需要一种比较列表中对象的方法。

    如果
    等于
    =>是否保存?应该是相反的吗?你用内环干什么??只是好奇,因为
    j
    在您的共享代码中未使用。@azro如果我列表中的每个元素都与dabase中的每个元素相等,我不想保存它。@nullpointer我已经编辑了它,如果只有一个匹配=>不保存?你就是这么说的?因为这根本不是你的代码在做的如果
    等于
    =>保存?应该是相反的吗?你用内环干什么??只是好奇,因为
    j
    在您的共享代码中未使用。@azro如果我列表中的每个元素都与dabase中的每个元素相等,我不想保存它。@nullpointer我已经编辑了它,如果只有一个匹配=>不保存?你就是这么说的?因为这根本不是你的代码在做什么。它工作得很好。非常感谢你。所以我哈