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;
}