Java 比较两个列表并生成具有差异的新列表
我试图构建一个函数,比较两个对象列表并返回一个有差异的列表 我将使用它与我的数据库中的数据进行比较,以检查从爬虫程序中检索到的数据是否是新的Java 比较两个列表并生成具有差异的新列表,java,arraylist,Java,Arraylist,我试图构建一个函数,比较两个对象列表并返回一个有差异的列表 我将使用它与我的数据库中的数据进行比较,以检查从爬虫程序中检索到的数据是否是新的 public static List checkForNewTweets(List timeline, List database) { List<TimelineTweet> newTweets = new ArrayList<>(); List<TimelineTweet> timelineT
public static List checkForNewTweets(List timeline, List database) {
List<TimelineTweet> newTweets = new ArrayList<>();
List<TimelineTweet> timelineTweets = timeline;
List<TimelineTweet> databaseTweets = database;
for (TimelineTweet timelineTweet : timelineTweets) {
for (TimelineTweet databaseTweet : databaseTweets) {
if (!timelineTweet.equals(databaseTweet)) {
newTweets.add(timelineTweet);
break;
}
}
}
return newTweets;
}
这根本不起作用,有没有办法为此创建一个递归函数?您当前的逻辑可能会将所有TimeLineWeets添加到NewWeets列表中,因为如果databaseTweets至少包含两个元素,那么其中至少有一个元素不等于TimeLineWeets列表中的给定元素 只有在将TimeLineWeet与所有数据库推文进行比较后,才能将其添加到NewWeets列表中,因为这是知道当前TimeLineWeet在任何数据库推文中不匹配的唯一方法:
看看你的代码,我想我只想从第一个列表中删除第二个列表的元素,并将其分配给第三个
为什么不使用timeline.removeAlldatabase,然后使用newweets.addAlltimeline呢?考虑另一种方法
public static <E> List<E> getDiff(List<E> list, List<E> list1){
if(list.size() >= list1.size())
return getDiffList(list, list1);
return getDiffList(list1, list);
}
private static <E> List<E> getDiffList(List<E> list, List<E> list1) {
List<E> newList = new ArrayList<>(list);
newList.removeAll(list1);
return newList;
}
请注意,这将只报告不同的元素,任何重复项都将被忽略
List<String> strings = Arrays.<String>asList("A", "B", "C");
List<String> strings1 = Arrays.<String>asList("A","B","D","C","B","Z","A");
结果列表将是[D,Z]如果这是一个选项,您应该看看java的集合类,因为这些类的包含计算成本要低得多。我想你的TimeLineWeets是可比的,比如写了它们的时间戳,因此可以用在树集中,允许在logn中查找和插入。另一个不同的选项是LinkedHashSet,它提供插入顺序迭代和常量时间操作,或者如果您根本不关心顺序的话,它只是HashSet 如果您不再需要时间线,但只对新推文感兴趣,您可以删除数据库中已有的所有项目:
Java中的所有集合类都可以使用这些操作,但集合的操作速度更快。旁注:Java集合中已经存在此函数;检查是否有保留
List<String> strings = Arrays.<String>asList("A", "B", "C");
List<String> strings1 = Arrays.<String>asList("A","B","D","C","B","Z","A");
public static TreeSet<TimelineTweet> checkForNewTweets(
final TreeSet<TimelineTweet> timeline, final TreeSet<TimelineTweet> database) {
timeline.removeAll(database);
return timeline;
}
public static TreeSet<TimelineTweet> checkForNewTweets(
TreeSet<TimelineTweet> timeline, TreeSet<TimelineTweet> database) {
final TreeSet<TimelineTweet> newTweets = new TreeSet<>(timeline);
newTweets.removeAll(database);
return timeline;
}