比较2个列表并生成具有差异的新列表

时间:2015-04-04 09:47:09

标签: java arraylist

我正在尝试构建一个比较2个对象列表的函数,并返回一个带有差异的列表。

我将使用它来检查从爬虫程序检索的数据是否是新数据,方法是将其与数据库中的数据进行比较。

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

这根本不起作用,有没有办法为此做一个递归函数?

4 个答案:

答案 0 :(得分:0)

您当前的逻辑可能会将所有TimelineTweet添加到newTweets列表,因为如果databaseTweets包含至少两个元素,则其中至少有一个不等于给定timelineTweets列表的元素。

只有在完成timelineTweet与所有databaseTweets的比较后,您才能将其添加到newTweets列表中(因为这是了解当前{的唯一方法{1}}在任何timelineTweet}中都不匹配:

databaseTweets

答案 1 :(得分:0)

查看你的代码我认为只想从第一个列表中删除第二个列表的元素并将其分配给第三个列表。

为什么不使用timeline.removeAll(数据库),然后使用newTweets.addAll(时间轴)

答案 2 :(得分:0)

考虑另一种方法。

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]

答案 3 :(得分:0)

如果这是一个选项,你应该看一下java的Set类,因为对于那些类来说,包含要便宜得多。我猜你的TimelineTweetComparable,例如它们的时间戳,因此可以在TreeSet中使用,允许在log(n)中查找和插入。一个不同的选项是LinkedHashSet提供插入顺序迭代和常量时间操作,或者只是HashSet,如果你根本不在乎排序。

如果您再次不需要timeline,但只对新推文感兴趣,则可以删除database中已有的所有项目:

public static TreeSet<TimelineTweet> checkForNewTweets(
        final TreeSet<TimelineTweet> timeline, final TreeSet<TimelineTweet> database) {
    timeline.removeAll(database);
    return timeline;
}

备选方案:复制timeline,然后删除database条目。

public static TreeSet<TimelineTweet> checkForNewTweets(
        TreeSet<TimelineTweet> timeline, TreeSet<TimelineTweet> database) {
    final TreeSet<TimelineTweet> newTweets = new TreeSet<>(timeline);
    newTweets.removeAll(database);
    return timeline;
}

这些操作适用于Java中的所有集合类,但Set的速度更快。