代码之家  ›  专栏  ›  技术社区  ›  Manuel Selva

如何从集合和比较器中获取列表

  •  12
  • Manuel Selva  · 技术社区  · 14 年前

    什么是“好”(为什么?)得到一个解决方案 List 从A Set 根据给定的 Comparator ?

    5 回复  |  直到 13 年前
        1
  •  12
  •   Tyler Treat    13 年前
    Set<Object> set = new HashSet<Object>();
    
    // add stuff
    
    List<Object> list = new ArrayList<Object>(set);
    Collections.sort(list, new MyComparator());
    
        2
  •  6
  •   BalusC    14 年前

    只需构建它。这个 ArrayList 有一个 constructor taking another Collection .

    Set<Foo> set = new TreeSet<Foo>(new FooComparator<Foo>());
    // Fill it.
    
    List<Foo> list = new ArrayList<Foo>(set);
    // Here's your list with items in the same order as the original set.
    
        3
  •  2
  •   iirekm    14 年前

    要么:

    Set<X> sortedSet = new TreeSet<X>(comparator); ...
    List<X> list = new ArrayList<X>(sortedSet);
    

    或:

    Set<X> unsortedSet = new HashSet<X>(); ...
    List<X> list = new ArrayList<X>(unsortedSet);
    Collections.sort(list, comparator);
    
        4
  •  1
  •   Stephen C    14 年前

    假设您从一个未排序的集或一个按不同顺序排序的集开始,那么假设您需要一个可修改的列表,下面的内容可能是最有效的。

    Set<T> unsortedSet = ... 
    List<T> list = new ArrayList<T>(unsortedSet); 
    Collections.sort(list, comparator);
    

    如果可以接受不可修改的列表,那么下面的速度会更快一些:

    Set<T> unsortedSet = ... 
    T[] array = new T[unsortedSet.size()];
    unsortedSet.toArray(array);
    Arrays.sort(array, comparator);
    List<T> list = Arrays.asList(array);
    

    在第一版中, Collections.sort(...) 将列表内容复制到数组,对数组进行排序,并将排序后的元素复制回列表。第二个版本更快,因为它不需要复制排序的元素。

    但老实说,绩效差异可能并不显著。实际上,随着输入集的大小越来越大,性能将由 O(NlogN) 是时候整理了。复制步骤是 O(N) 随着氮的增加,其重要性也会降低。

        5
  •  0
  •   Michael Borgwardt    14 年前

    这就是你得到 List 当你拥有 Set :

    List list = new ArrayList(set);
    

    不确定您希望如何处理 Comparator . 如果 集合 排序后,列表将按排序顺序包含元素。