【问题标题】:Sort Java Collection对 Java 集合进行排序
【发布时间】:2011-10-20 22:05:26
【问题描述】:

我有一个 Java 集合:

Collection<CustomObject> list = new ArrayList<CustomObject>();

CustomObject 在显示列表之前现在有一个id 字段我想按id 对这个集合进行排序。

有什么办法可以做到吗?

【问题讨论】:

标签: java sorting collections


【解决方案1】:

使用Comparator

List<CustomObject> list = new ArrayList<CustomObject>();
Comparator<CustomObject> comparator = new Comparator<CustomObject>() {
    @Override
    public int compare(CustomObject left, CustomObject right) {
        return left.getId() - right.getId(); // use your logic
    }
};

Collections.sort(list, comparator); // use the comparator as much as u want
System.out.println(list);

另外,如果CustomObjectimplements Comparable,那么只需使用Collections.sort(list)

使用 JDK 8,语法要简单得多。

List<CustomObject> list = getCustomObjectList();
Collections.sort(list, (left, right) -> left.getId() - right.getId());
System.out.println(list);

更简单

List<CustomObject> list = getCustomObjectList();
list.sort((left, right) -> left.getId() - right.getId());
System.out.println(list);

最简单

List<CustomObject> list = getCustomObjectList();
list.sort(Comparator.comparing(CustomObject::getId));
System.out.println(list);

显然初始代码也可以用于 JDK 8。

【讨论】:

  • 如果他们想要排序不止一次怎么办?
  • 已编辑答案,请检查。显然,如果可以理解如何使用比较器,这没什么大不了的。如果你可以做一次,也可以做n次:)
  • 是的...如果类实现可比较然后不需要通过比较器...很好..ta
  • Collection 类型中的方法 sort(List, Comparator super T>) 不适用于参数(Collection,Comparator),您不能将 Collection 传递给已死的排序方法烦人
  • 排序方法适用于列表,不适用于集合。列表变量的类型应更改为 List 以使此示例正常工作。
【解决方案2】:

问题是:“排序集合”。所以你不能使用Collections.sort(List&lt;T&gt; l, Comparator&lt;? super T&gt; comparator)

一些提示:

对于集合类型:

Comparator<String> defaultComparator = new Comparator<String>() {
   @Override
   public int compare(String o1, String o2) {
       return o1.compareTo(o2);
   }
};

Collection<String> collection = getSomeStringCollection();
String[] strings = collection.toArray(new String[collection.size()]);
Arrays.sort(strings, defaultComparator);
List<String> sortedStrings = Arrays.asList(strings);

Collection<String> collection = getSomeStringCollection();
List<String> list = new ArrayList(collection);
Collections.sort(list, defaultComparator);
collection = list; // if you wish

对于列表类型:

List<String> list = getSomeStringList();
Collections.sort(list, defaultComparator);

对于集类型:

Set<String> set = getSomeStringSet();
// Than steps like in 'For Collection type' section or use java.util.TreeSet
// TreeSet sample:
// Sorted using java.lang.Comparable.
Set<String> naturalSorted = new TreeSet(set);

Set<String> set = getSomeStringSet();
Set<String> sortedSet = new TreeSet(defaultComparator);
sortedSet.addAll(set);

Java 8 版本。有java.util.List#sort(Comparator&lt;? super E&gt; c)方法

List<String> list = getSomeStringList();
list.sort(defaultComparator);

List<String> list = getSomeStringList();
list.sort((String o1, String o2) -> o1.compareTo(o2));

或者对于实现 Comparable 的类型:

List<String> list = getSomeStringList();
list.sort(String::compareTo);

【讨论】:

  • 我 4 年前问过这个问题,现在你正在回答。
  • 感谢您的回复。真的很感激。 4 年,仍然错误的答案被标记为正确的答案。谁是坏人?
  • @Makky 因为它回答的是列表,而不是集合
【解决方案3】:

一个稍微不同的例子是,如果你有一个没有实现 Comparable 的类,但你仍然想在一个字段或方法上对其进行排序。

Collections.sort(allMatching, new Comparator<ClassOne>() {
  @Override public int compare(final ClassOne o1, final ClassOne o2) {
    if (o1.getMethodToSort() > o2.getMethodToSort()) {
      return 1;
    } else if (o1.getMethodToSort() < o2.getMethodToSort()) {
      return -1;
    }  
    return 0;
  }
});

【讨论】:

  • 您实现的 if 语句与 compareTo() 所做的完全一样。
  • 不同之处在于,在本例中,ClassOne 类不是可比较类,它没有实现 Comparable。我只是想展示一个示例,说明如何使用集合和比较器对不可比较的对象进行排序。 ClassOne 没有 compareTo 方法..
  • 不适用于 java 6(Collections.sort 仅限于 List)
  • 在 Java 7 或 8 中,您不会发现 Collections.sort 采用 Set。根据定义,List 是有序的元素序列,而 Set 是不同的无序元素列表。如果您想在 Set 中订购,请查看 TreeSet
【解决方案4】:

您应该实现Comparator 接口。

示例:

public class CustomComparator implements Comparator<CustomObject> 
{
    @Override
    public int compare(CustomObject o1, CustomObject o2) {
        return o1.getId().compareTo(o2.getId());
    }
}

然后你可以使用 Collections 类Collections.sort() 方法:

Collections.sort(list, new CustomComparator());

【讨论】:

    【解决方案5】:

    在您的 customObject 上实现 Comparable 接口。

    【讨论】:

      【解决方案6】:

      从 Java 8 开始,您现在可以使用 lambda 来处理流:

      list.stream().sorted(Comparator.comparing(customObject::getId))
                   .foreach(object -> System.out.println(object));
      

      【讨论】:

        【解决方案7】:

        很多正确答案,但我没有找到这个: 集合无法排序,只能遍历它们。

        现在您可以遍历它们并创建一个新的排序something。请按照此处的答案进行操作。

        【讨论】:

          【解决方案8】:

          Comparator 是方式

          另见

          【讨论】:

            【解决方案9】:

            使用sort

            你只需要这样做:

            列表中的所有元素都必须实现 Comparable 接口。

            (或者使用它下面的版本,正如其他人已经说过的那样。)

            【讨论】:

              【解决方案10】:

              使用 Java 8,您有多种选择,结合方法引用和内置的 comparing 比较器:

              import static java.util.Comparator.comparing;
              
              Collection<CustomObject> list = new ArrayList<CustomObject>();
              
              Collections.sort(list, comparing(CustomObject::getId));
              //or
              list.sort(comparing(CustomObject::getId));
              

              【讨论】:

                【解决方案11】:

                SortedSet 和比较器。比较器应该尊重 id 字段。

                【讨论】:

                • @Qwerky - 我知道他有一份清单。我建议他使用一套。除非他想保持重复和插入顺序。
                【解决方案12】:

                您可以使用 java Custom Class 进行排序。

                【讨论】:

                  【解决方案13】:

                  你的例子:

                  Collection<CustomObject> list = new ArrayList<CustomObject>();
                  

                  您也可以使用比较器:

                  list.sort(Comparator.comparingLong(CustomObject::getSomethingToCompare));
                  

                  只要替换掉 compareLong 方法,有很多选择,但取决于你想在 "getSomethingToCompare" 上传递什么。

                  这个link 也可能有帮助。

                  【讨论】:

                    【解决方案14】:

                    你也可以使用:

                    Collections.sort(list, new Comparator<CustomObject>() {
                        public int compare(CustomObject obj1, CustomObject obj2) {
                            return obj1.id - obj2.id;
                        }
                    });
                    System.out.println(list);
                    

                    【讨论】:

                      【解决方案15】:

                      非常清楚,Collection.sort(list, compartor) 不返回任何东西,所以像这样的list = Collection.sort(list, compartor); 会抛出一个错误(void 不能转换为 [list type]),而应该是 Collection.sort(list, compartor)

                      【讨论】:

                      • 完全不相关的答案。
                      最近更新 更多