2015-04-04 58 views
0

我想构建一个函数,比较2个对象列表并返回一个列表的差异。比较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; 
} 

这是不工作的,有没有办法为此做一个递归函数?

+0

注意:这个函数已经存在于java Collection中;检查'retainAll()' – GhostCat 2015-04-04 09:59:57

回答

0

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

您完成比较后,才所有databaseTweets可以将其添加到newTweets名单(因为这是要知道,目前不会在任何databaseTweets匹配的唯一途径):

for (TimelineTweet timelineTweet : timelineTweets) { 
    boolean found = false; 
    for (TimelineTweet databaseTweet : databaseTweets) { 
     if (timelineTweet.equals(databaseTweet)) {  
      found = true; 
      break; 
     } 
    } 
    if (!found) 
     newTweets.add(timelineTweet); 
} 
0

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

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

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]

0

如果这是一种选择,你应该有一个了解Java的设置类,因为遏制便宜得多来计算这些类。我想你的TimelineTweet s是Comparable例如wrt时间戳,因此可以在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 s更快。