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

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

【问题讨论】:

    标签: java sorting 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 我想捐赠给社区。当我搜索信息时,我找不到它。我试图让下一个人的工作更轻松。 stackoverflow.com/questions/18557/…
              • 是的,当然,但是您提供的链接实际上是在谈论一个真正的问题(即那些没有答案的问题,然后找到它)。你在这里的问题只是为了给出答案……我实际上可以输入数百个问题并自己回答;这不是重点!
              • @Seb:我不同意。我看不出这个问题有什么问题。这显然不是一个极其简单的问题,现在他知道了一个比以前更好的方法!
              • 一个真正的问题,但在谷歌出现问题后我自己找到了答案。 Stackoverflow 当时还不存在。我把它发布在我的网站上,它帮助了其他人,所以我认为它在这里可能有用。
              • 奖励:如果您碰巧对自己的对象类型进行排序,那么您始终可以实现 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 将列表作为参数。
              猜你喜欢
              • 1970-01-01
              • 2015-02-18
              • 2021-10-15
              • 2015-03-19
              • 1970-01-01
              • 2020-12-23
              • 2020-09-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多