在Java中删除集合中重复的最佳方法?

在Java中删除集合中重复的最佳方法?,java,arrays,set,Java,Arrays,Set,这是一个由两部分组成的问题: 首先,我想知道从集合中删除重复元素的最佳方法是什么。到目前为止,我一直采用的方法是将集合转换为集合。我知道集合不能有重复的元素,所以它只能为我处理它 这是一个有效的解决方案吗?循环和删除重复会更好/更习惯/更快吗?这有关系吗 我的第二个(相关)问题是:将数组转换为集合的最佳方式是什么?假设阵列arr是我一直使用的方法,如下所示: Set x=新的HashSet(Arrays.asList(arr)); 这会将数组转换为列表,然后再转换为集合。似乎有点迂回。有没有

这是一个由两部分组成的问题:

首先,我想知道从集合中删除重复元素的最佳方法是什么。到目前为止,我一直采用的方法是将集合转换为集合。我知道集合不能有重复的元素,所以它只能为我处理它

这是一个有效的解决方案吗?循环和删除重复会更好/更习惯/更快吗?这有关系吗

我的第二个(相关)问题是:将数组转换为集合的最佳方式是什么?假设阵列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问题。