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

标签 java collections

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

@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<>();
}

现在我使用方法从数据库获取所有数据:

public Iterable<PostFeedItem> findAllPostFeedItemInDatabase() {
        return 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<PostFeedItem> listPostFieldItemsList<PostFeedItem> listItemFromDatabase并保存 listPostFieldItems 中的所有对象如果 listPostFieldItems 中有任何元素不匹配listPostFieldItems .

最佳答案

你的代码是错误的,因为它应该使用索引j,并且你应该以不同的方式构建循环,这里你有一个匹配,所以数据库中的现有记录,你保存,你需要相反的记录.

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

List<String> allTitles = postFeedItemInDatabase.stream().map(PostFeedItem::getContentTitle).collect(Collectors.toList());

然后就可以了

  1. 从数据库标题列表中的第一个列表中删除与 : 匹配的标题

    listPostFieldItems.removeIf(elt -> allTitles.contains(elt.contentTitle));
    listPostFieldItems.forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
    
  2. 或者,保留不匹配的

    listPostFieldItems = listPostFieldItems.stream().filter(elt -> !allTitles.contains(elt.contentTitle)).collect(Collectors.toList());
    listPostFieldItems.forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
    
  3. 连接操作

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

关于java - java中如何比较两个列表对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53878860/

相关文章:

java - 为什么我会使用 list.clear()

java - 如何包装 java.util.Iterator 以更改被迭代对象的类型

java - 为什么ArrayList有 "implements List"?

java - 通过类名查找 pom 依赖项

java - 将二进制字符串转换为整数时出现 NumberFormatException

java - 无需启动 Eclipse 即可访问属性/环境变量?

scala - scala.collection.TraversableView.NoBuilder 是如何工作的?

Java - 关闭所有对象后的 JDBC 内存使用

java - 加载包中的每个类

scala - Scala 中的 TreeMap 键和迭代