代码之家  ›  专栏  ›  技术社区  ›  kgrad

在Java中删除集合中重复项的最佳方法是什么?

  •  0
  • kgrad  · 技术社区  · 17 年前

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

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

    Set x = new HashSet(Arrays.asList(arr));

    6 回复  |  直到 17 年前
        1
  •  7
  •   John Kugelman Michael Hodel    17 年前
    1. 你有关于这个收藏的任何信息吗,比如说它已经被排序了,或者它主要包含重复项或唯一项?对于任意集合,我认为将其转换为 Set 很好。

    2. Arrays.asList() List 它使用数组作为后备存储,因此这是一个廉价的操作。所以,你的制作方式

        2
  •  4
  •   William Brendel    17 年前

    使用 HashSet 的标准 Collection conversion constructor .根据 The Java Tutorials

    这里有一个简单但有用的Set习语。 假设你有一个Collection、c和 包含相同的元素,但具有 所有重复项均已消除。这 跟着一句话就行了。

    Collection<Type> noDups = new HashSet<Type>(c);
    

    它通过创建一个Set(通过 复制),最初包含所有 c中的元素。它使用 如所述 The Collection Interface 部分。

    这是这个成语的一个小变体 这维护了秩序 删除时的原始收藏 重复元素。

    Collection<Type> noDups = new LinkedHashSet<Type>(c);
    

    以下是一种通用方法 概括了前面的成语, 返回一组相同的泛型

    public static <E> Set<E> removeDups(Collection<E> c) {
        return new LinkedHashSet<E>(c);
    }
    
        3
  •  2
  •   erickson    17 年前

    Set 从包含重复的集合中提取是一种很好的方法。它的意图非常清楚,它比自己做循环更紧凑,并且它保持了源代码集合的完整性。

    为了创建一个 从数组中创建一个中间体 List Arrays.asList() 重量轻,效率高。不幸的是,在核心Java中没有更直接的API可以做到这一点。

        4
  •  1
  •   Carl Manaster    17 年前

    我认为你将物品放入一组中以产生独特物品集合的方法是最好的。它清晰、高效、正确。

        5
  •  1
  •   notnoop    17 年前

    1. 重复项

    同意其他答案:使用 Set 应该是删除重复项的最有效方法。 HashSet 应该跑进去 O(n) 平均时间。循环和删除重复将按以下顺序运行 O(n^2) 在大多数情况下建议使用。在某些情况下(例如内存有限),迭代可能是有意义的。

    Arrays.asList() 是一种不复制阵列的廉价操作,内存开销最小。您可以通过迭代数组来手动添加元素。

    
    public static  Set arrayToSet(T[] array) {
      Set set = new HashSet(array.length / 2);
      for (T item : array)
        set.add(item);
      return set;
    }
    
        6
  •  1
  •   Yishai    17 年前