如何在Java中将Set排序为List?

时间:2009-04-11 15:26:07

标签: java collections

在Java中,我有一个Set,我希望将其转换为已排序的Listjava.util.Collections包中是否有方法可以为我执行此操作?

10 个答案:

答案 0 :(得分:211)

答案provided by the OP不是最好的。这是低效的,因为它创建了一个新的List 一个不必要的新数组。此外,由于泛型数组的类型安全问题,它会引发“未经检查”的警告。

相反,请使用以下内容:

public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
  List<T> list = new ArrayList<T>(c);
  java.util.Collections.sort(list);
  return list;
}

这是一个用法示例:

Map<Integer, String> map = new HashMap<Integer, String>();
/* Add entries to the map. */
...
/* Now get a sorted list of the *values* in the map. */
Collection<String> unsorted = map.values();
List<String> sorted = Util.asSortedList(unsorted);

答案 1 :(得分:71)

排序集:

return new TreeSet(setIWantSorted);

或:

return new ArrayList(new TreeSet(setIWantSorted));

答案 2 :(得分:43)

List myList = new ArrayList(collection);
Collections.sort(myList);

...应该做的伎俩。在适用的情况下添加Generics的味道。

答案 3 :(得分:38)

以下是使用Java 8 Streams的方法:

mySet.stream().sorted().collect(Collectors.toList());

或使用自定义比较器:

mySet.stream().sorted(myComparator).collect(Collectors.toList());

答案 4 :(得分:9)

始终安全地使用Comparator或Comparable接口来提供排序实现(如果对象不是原始数据类型的String或Wrapper类)。 作为基于名称

对员工进行排序的比较器实现的示例
    List<Employees> empList = new LinkedList<Employees>(EmpSet);

    class EmployeeComparator implements Comparator<Employee> {

            public int compare(Employee e1, Employee e2) {
                return e1.getName().compareTo(e2.getName());
            }

        }

   Collections.sort(empList , new EmployeeComparator ());

当您需要在同一个对象上使用不同的排序算法时,比较器非常有用(Say emp name,emp salary等)。可以通过将Comparable接口用于所需对象来实现单模式排序。

答案 5 :(得分:5)

没有一种方法可以做到这一点。使用此:

@SuppressWarnings("unchecked")
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) {
  T[] array = collection.toArray(
    (T[])new Comparable[collection.size()]);
  Arrays.sort(array);
  return Arrays.asList(array);
}

答案 6 :(得分:3)

您可以将一个集转换为ArrayList,您可以使用ArrayListCollections.sort(List)进行排序。

以下是代码:

keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);     
Collections.sort(list);

答案 7 :(得分:2)

TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

其中originalset = unsorted set和list =要返回的列表

答案 8 :(得分:2)

@Jeremy Stein我想实现相同的代码。我也希望将集合排序为列表,因此不使用Set I将设置值转换为List并按其排序该列表的变量。 这段代码帮助了我,

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());

答案 9 :(得分:0)

我正在使用这段代码,比上面接受的答案更实用:

List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));