java - 将链表添加到链表时更好的去重方法?

标签 java duplicates

我正在尝试向 LinkedList 添加一些重复数据删除逻辑。重复项来自添加到主 LinkedList 的新 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;
  }

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

最佳答案

正如 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]

关于java - 将链表添加到链表时更好的去重方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57047535/

相关文章:

java - Android StartActivity 不会启动新 Activity

java - 如何在创建 java 之前估计 zip 文件的大小

java - GWT 对特定元素使用 DoubleClickHandler 和 ClickHandler

r - 提取一列中具有满足另一列中给定条件的重复条目的行

directory - 使用 7z @listfile 功能在不同文件夹中压缩具有相同名称的文件

r - R 中的配对观察

java - 除非整个盒子都填满,否则不要进入下一个 Activity

python - Pandas :TypeError:无法散列的类型: 'list'

MySQL分组重复ID而不丢失其他数据

java - 让checkstyle检查javax路径注解