在Java中删除集合中重复的最佳方法?
这是一个由两部分组成的问题: 首先,我想知道从集合中删除重复元素的最佳方法是什么。到目前为止,我一直采用的方法是将集合转换为集合。我知道集合不能有重复的元素,所以它只能为我处理它 这是一个有效的解决方案吗?循环和删除重复会更好/更习惯/更快吗?这有关系吗 我的第二个(相关)问题是:将数组转换为集合的最佳方式是什么?假设阵列arr是我一直使用的方法,如下所示:在Java中删除集合中重复的最佳方法?,java,arrays,set,Java,Arrays,Set,这是一个由两部分组成的问题: 首先,我想知道从集合中删除重复元素的最佳方法是什么。到目前为止,我一直采用的方法是将集合转换为集合。我知道集合不能有重复的元素,所以它只能为我处理它 这是一个有效的解决方案吗?循环和删除重复会更好/更习惯/更快吗?这有关系吗 我的第二个(相关)问题是:将数组转换为集合的最佳方式是什么?假设阵列arr是我一直使用的方法,如下所示: Set x=新的HashSet(Arrays.asList(arr)); 这会将数组转换为列表,然后再转换为集合。似乎有点迂回。有没有
Set x=新的HashSet(Arrays.asList(arr));
这会将数组转换为列表,然后再转换为集合。似乎有点迂回。有没有比双重转换更好/更惯用/更有效的方法
谢谢
集合
是可以的Arrays.asList()
不会创建全新的列表。它实际上只返回一个列表
,该列表使用数组作为其后备存储,因此这是一个廉价的操作。因此,从数组中创建集的方法也是我的方法
假设您真的需要集合语义,那么从包含重复集合的集合中创建一个新的
set
是一个很好的方法。很明显,它的目的是什么,它比自己做循环更紧凑,并且使源代码集合保持完整
对于从数组创建
集合
,创建中间列表
是一种常见的方法。Arrays.asList()
返回的包装器轻量级且高效。不幸的是,在核心Java中没有更直接的API来实现这一点。使用HashSet
的标准集合。根据:
这里有一个简单但有用的成语。
假设你有一个集合,c和
您想创建另一个集合吗
包含相同的元素但具有
消除所有重复项。这个
跟着一个班轮走就行了
Collection<Type> noDups = new HashSet<Type>(c);
Collection noDups=newhashset(c);
它通过创建一个集合(通过
定义,不能包含
重复),最初包含所有
c中的元素。它使用
标准转换构造函数
在本节中进行了描述
这是这个成语的一个小变体
这维持了秩序
删除时保留原始集合
重复元素
Collection<Type> noDups = new LinkedHashSet<Type>(c);
Collection noDups=newlinkedhashset(c);
下面是一个通用方法
概括了前面的成语,
返回一组相同的泛型
键入所传递的内容
public static <E> Set<E> removeDups(Collection<E> c) {
return new LinkedHashSet<E>(c);
}
publicstaticsetremovedups(集合c){
返回新的LinkedHashSet(c);
}
我认为你把物品放在一个集合中产生独特物品的方法是最好的。它清晰、高效、正确
如果您在进入集合的过程中对使用array.asList()感到不舒服,您可以简单地在数组上运行foreach循环以向集合中添加项,但我认为您的方法没有任何危害(对于非基本数组)。Arrays.asList()返回一个由源数组“支持”的列表,因此它在时间或空间上没有很大的开销。<1。
复制品
同意其他答案:使用Set
应该是删除重复项的最有效方法HashSet
平均应在O(n)
时间内运行。循环和删除重复将按照O(n^2)
的顺序运行。因此,在大多数情况下,建议使用Set
。在某些情况下(例如,内存有限),迭代可能是有意义的
二,。
Arrays.asList()
是一种廉价的操作,不复制数组,内存开销最小。您可以通过迭代数组来手动添加元素
public static Set arrayToSet(T[] array) {
Set set = new HashSet(array.length / 2);
for (T item : array)
set.add(item);
return set;
}
除非您知道任何特定的性能瓶颈(例如数万项的集合),否则将其转换为一个集合是一个完全合理的解决方案,并且应该是(IMO)解决此问题的第一种方法,并且只有在有特定问题需要解决时才寻找更理想的解决方案。好问题,你可能想把它们分成两个独立的SO问题。