gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:44:35 25 4
gpt4 key购买 nike

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

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com