如何比较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
中的任何元素不匹配列表PostFieldItems1)将列表转换为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我已经编辑了它,如果只有一个匹配=>不保存?你就是这么说的?因为这根本不是你的代码在做什么。它工作得很好。非常感谢你。所以我哈