如何在 Java 中将 Set 排序为列表?

Posted

技术标签:

【中文标题】如何在 Java 中将 Set 排序为列表?【英文标题】:How do I sort a Set to a List in Java? 【发布时间】:2010-10-18 22:12:13 【问题描述】:

在 Java 中,我有一个 Set,我想把它变成一个排序好的 Listjava.util.Collections 包中是否有可以为我执行此操作的方法?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

@Jeremy Stein 我想实现相同的代码。我也想将集合排序为列表,因此我没有使用 Set 将集合值转换为 List 并按它的一个变量对该列表进行排序。 这段代码帮助了我,

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

【讨论】:

【参考方案3】:

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

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

或使用自定义比较器:

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

【讨论】:

【参考方案4】:

始终可以安全地使用 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 ());

当您需要对同一对象使用不同的排序算法时(例如员工姓名、员工薪水等),比较器很有用。单模式排序可以通过在所需对象中使用 Comparable 接口来实现。

【讨论】:

【参考方案5】:
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

其中 originalset = 未排序的集合,list = 要返回的列表

【讨论】:

TreeSet 还会对列表进行重复数据删除,如果您不这样做,可能会导致错误的结果。【参考方案6】:

答案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);

【讨论】:

谢谢! SuppressWarnings 一直困扰着我。 @sunleo Util 类是包含我编写的asSortedList() 方法的类。换句话说,您自己编写 Util 类,然后将代码放入其中。 哈哈,我认为它来自 java.util 之类的默认包,好的,谢谢。 这可能是一个很好的通用实用程序函数,但事实是,它仍然没有效率。考虑就地排序,确保一开始就将您的套装放在正确的容器中。还可以考虑将 TreeSet 用作数据的直接容器。如果您的数据无论如何都需要是唯一的,并且您需要一个 Set,那么请使用 TreeSet,一次捕捉两只苍蝇。 作为对只阅读最佳答案的人的说明:看看下面的 nschum 的答案,它使用 Java 8 的流。如果你可以使用 Java 8,那就去吧。它们更灵活、更高效。【参考方案7】:

您可以将集合转换为ArrayList,在其中您可以使用Collections.sort(List)ArrayList 进行排序。

代码如下:

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

【讨论】:

【参考方案8】:
List myList = new ArrayList(collection);
Collections.sort(myList);

... 但是应该可以解决问题。在适用的情况下使用泛型添加风味。

【讨论】:

我有一个有用的 sn-p 我想捐赠给社区。当我搜索信息时,我找不到它。我试图让下一个人的工作更轻松。 ***.com/questions/18557/… 是的,当然,但是您提供的链接实际上是在谈论一个真正的问题(即那些没有答案的问题,然后找到它)。你在这里的问题只是为了给出答案……我实际上可以输入数百个问题并自己回答;这不是重点! @Seb:我不同意。我看不出这个问题有什么问题。这显然不是一个极其简单的问题,现在他知道了一个比以前更好的方法! 一个真正的问题,但在谷歌出现问题后我自己找到了答案。 *** 当时还不存在。我把它发布在我的网站上,它帮助了其他人,所以我认为它在这里可能有用。 奖励:如果您碰巧对自己的对象类型进行排序,那么您始终可以实现 Comparable 并覆盖 compareTo 方法。【参考方案9】:

排序集:

return new TreeSet(setIWantSorted);

或:

return new ArrayList(new TreeSet(setIWantSorted));

【讨论】:

这是我的第一个想法,但提问者想要一个列表 @Alex:这个办法还是可以用的; return new ArrayList(new TreeSet(setIWantSorted)) 我实际上使用了这个解决方案,但我不建议这样做。正如有关 TreeSet 的文档所述(请参阅 download.oracle.com/javase/1.4.2/docs/api/java/util/…),它有效地使用 compareTo() 方法而不是 equals() 方法 - 因此,如果集合中有两个对象具有相同的 equals() 结果,它们将是被视为重复,因此不会被添加到 TreeSet。当心。 @fwielstra:既然输入也是Set,你怎么能在输入中有相等的对象? @ryanprayogo 值得一提的是,new TreeSet 接受Collections,而不仅仅是Sets。并非所有阅读此答案的人都会使用Set,即使这是最初的问题所要问的。【参考方案10】:

没有单一的方法可以做到这一点。使用这个:

@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);

【讨论】:

还有一个 Collections.sort 函数,但我认为它做同样的事情。无论如何 +1。 Collections.sort 将列表作为参数。

以上是关于如何在 Java 中将 Set 排序为列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将集合转换为列表?

如何在 Java 中将 HashMap 转换为 List?

在 Java 中将 List 转换为 Set 的最简单方法

如何在 jQuery UI 中将多个可排序列表相互连接?

如何在ansible中将字典或列表转换为字符串

如何在 py4j 中将 Java 列表转换为 Python 列表