我在Java中使用这个实用程序:import java.util.LinkedList;
。我想知道是否有办法添加 2 个链表而不允许重复(例如 python 中的集合(,或者是否有内置函数可以从该实用程序中删除重复项?
如果答案是否定的,有没有办法显式编写一个函数来从这个实用程序中删除重复项?
谢谢!
您可以使用java 8
stream
来获取唯一值。
new_list = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
在这里,list1
和list2
都保持不变
如果您不想允许重复,并且不一定需要实现 java.util.List 接口,您可能需要考虑改用 java.util.LinkedHashSet。此集合将保持元素的顺序,不允许重复。如果您有要转换的列表,只需使用 LinkedList 作为构造函数参数创建一个新的 LinkedHashSet。
遍历第二个列表的元素以检查每个元素是否包含在第一个列表中是一项代价高昂的操作,因此您可能希望避免这样做。
使用LinkedHashSet的主要优点是您可以获得Set功能并保持元素的顺序。LinkedHashSet 的主要缺点是您无法根据元素的位置查询集合,因为这不是 Set 接口中定义的方法,并且 LinkedHashSet 不实现 List 接口。此外,在创建新对象时,您最终将创建一个新列表(或集合(,而不是修改当前列表。
假设您有两个 LinkedList 实例 list1 和 list2,您可以执行以下操作:
Set<?> linkedSet = new LinkedHashSet<>(list1);
linkedSet.addAll(list2);
list1 = new LinkedList(linkedSet);
如果您真的只想添加到第一个列表的实例中,那么您可以执行类似操作:
Set<?> linkedSet = new LinkedHashSet<>(list1);
linkedSet.addAll(list2);
list1.clear();
list1.addAll(linkedSet);
创建 LinkedHashSet 不是一个昂贵的操作,并且 contains(( 方法在恒定时间内运行(即不依赖于集合的大小(,因此检查元素是否已经包含在原始集中通常不会花费太多时间,尤其是当您的列表包含大量元素时。