按照对象属性对ArrayList进行排序

9

我有一个对象的ArrayList。这些对象有一个属性或数据类型是'String'。

我需要按照这个字符串对ArrayList进行排序。如何实现?

2个回答

14
你需要编写一个 Comparator<MyObject> 并使用 Collections.sort(List<T>, Comparator<? super T> 来对你的 List 进行排序。
否则,你的 MyObject 也可以实现 Comparable<MyObject>,定义基于你特定属性比较的 自然顺序,接着可以使用 Collections.sort(List<T>

另请参阅

相关问题

关于按不同标准排序 List

关于 ComparatorComparable

  • Java集合框架为什么提供两种不同的排序方法?

  • 谢谢! :) 你能详细说明一下比较器的使用方式吗?它如何根据字符串返回排序后的对象。请注意,我需要按照字符串的字母顺序对它们进行排序。 - Vishal
    哦,我明白比较器的概念了。但是由于其他问题,我无法在对象上实现这个接口。因此,我需要创建一个比较器对象。 - Vishal
    1
    @Vishal:看一下这个链接的问题(对联系人的ArrayList进行排序)。它有你要找的例子和更多内容。另外,_Effective Java第二版,第12项:考虑实现Comparable_。 - polygenelubricants

    7

    如果您需要按对象的多个属性进行排序,那么另一种更灵活的方法是使用GuavaOrdering类和其onResultOf(Function)选项。这非常适合按属性排序,因为可以使用Function来检索和返回对象的特定属性。

    以一个简单的例子为例,假设有一个名为Person的类,其中包含String getFirstName()String getLastName()方法。

    List<Person> people = ...;
    Collections.sort(people, Ordering.natural().onResultOf(
        new Function<Person, String>() {
          public String apply(Person from) {
            return from.getFirstName();
          }
        }));
    

    上述内容将根据名字的顺序对列表进行排序。
    为了使其更易于阅读,您可能希望将您可能想要使用的函数定义为 Person 类上的 public static final 字段。然后,您可以像这样按姓氏排序:
    Collections.sort(people, Ordering.natural().onResultOf(Person.GET_LAST_NAME));
    

    作为一个有趣的旁注,使用Java 8的lambda表达式和方法引用将使所有这些变得更加容易。您将能够编写类似于以下内容而无需定义任何笨拙的匿名内部类或静态final字段:
    import static java.util.Comparator.comparing;
    ...
    
    people.sort(comparing(Person::getLastName));
    

    你说得对。使用Java 8的lambda表达式应该会更容易得多。不幸的是,Sun和Oracle再次错过了向集合和数组添加一些高级方法(例如sortBy)的机会。因此,一个微不足道的Scala代码行(“people.sortBy(_.lastName)”)仍然需要转换成四倍长的Java代码行。这很遗憾。但无论如何,感谢您提供的Ordering类中的Guava快捷方式。在Java 8中仍然很有用。 - Stefan Endrullis
    @StefanEndrullis:通过一个静态导入,Java 8 中的同一件事情看起来像这样:people.sort(comparing(Person::lastName))。似乎你有点低估了它。 - ColinD
    好的,你最后一次编辑通过静态导入“comparing”使它变得更短更易读。感谢这个提示。 - Stefan Endrullis

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接