将链表添加到链表时,更好的重复数据删除方法?

时间:2019-07-15 21:42:48

标签: java duplicates

我正在尝试向LinkedList添加一些重复数据删除逻辑。重复项来自新的LinkedLists,这些新的LinkedLists已添加到主LinkedList。

masterList.addAll(0, newList)

对我来说,棘手的部分是,每个新列表都被添加到主列表的开头(如上面的代码所示)。并且重复数据删除需要保留以后添加的元素。例如:

masterList = [3, 4]
newList = [5, 4]
masterList.addAll(0, newList)

现在masterList = [5, 4, 3, 4]。并且应将masterList末尾的“ 4”作为重复项删除,而需要保留后面添加的“ 4”。因此,重复数据删除结果应为masterList = [5, 4, 3]

我当前的解决方案是在“添加”完成后删除重复数据:

protected List<String> dedupeIds(List<String> masterList) {
    // HashSet to store seen values
    HashSet<String> set = new HashSet<>();
    for (Iterator<String> iter = masterList.iterator(); iter.hasNext();) {
      String doc_id = iter.next();
      // put the doc id in Set hs, if cannot add as key, it means dupe
      if (!set.add(doc_id)) {
        iter.remove();
      }
    }
    return masterList;
  }

当前解决方案有效,但是我想知道在“添加”期间是否有一种重复数据删除方法?

1 个答案:

答案 0 :(得分:1)

正如Chrylis所建议的,也许考虑使用其他收集类型。 LinkedHashSet是存储唯一元素(这是Set)同时保留顺序的好选择。

final Set<Integer> a = new LinkedHashSet<>(Arrays.asList(3, 4));
System.out.println(Arrays.toString(a.toArray())); // Prints [3, 4]

final Set<Integer> b = new LinkedHashSet<>(Arrays.asList(5, 4));
System.out.println(Arrays.toString(b.toArray())); // Prints [5, 4]

b.addAll(a);
System.out.println(Arrays.toString(b.toArray())); // Prints [5, 4, 3]