我编写代码从网站上抓取所有信息。我希望当我过滤并保存到数据库时,我过滤的数据不包含数据库。如果包含数据库,我不想保存它(“因为它重复”)。我在下面编写代码:
@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> listPostFieldItems
与 List<PostFeedItem> listItemFromDatabase
并保存 listPostFieldItems
中的所有对象如果 listPostFieldItems
中有任何元素不匹配listPostFieldItems
.
最佳答案
你的代码是错误的,因为它应该使用索引j
,并且你应该以不同的方式构建循环,这里你有一个匹配,所以数据库中的现有记录,你保存,你需要相反的记录.
有更简单的方法,对于这两种情况,我建议首先保留 contentTitle
列表,因为它是查找匹配/不匹配的关键
List<String> allTitles = postFeedItemInDatabase.stream().map(PostFeedItem::getContentTitle).collect(Collectors.toList());
然后就可以了
从数据库标题列表中的第一个列表中删除与 : 匹配的标题
listPostFieldItems.removeIf(elt -> allTitles.contains(elt.contentTitle)); listPostFieldItems.forEach(postFeedItem -> postFeedItemRepository.save(postFeedItem));
或者,保留不匹配的
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));
关于java - java中如何比较两个列表对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53878860/