按对象属性对对象的 ArrayList 进行排序
Posted
技术标签:
【中文标题】按对象属性对对象的 ArrayList 进行排序【英文标题】:Sorting ArrayList of Objects by Object attribute 【发布时间】:2011-03-21 12:40:45 【问题描述】:我有一个对象的 Arraylist。这些对象有一个属性或数据类型——“字符串”。 我需要按该字符串对 Arraylist 进行排序。如何做到这一点?
【问题讨论】:
【参考方案1】:如果您可能希望对对象的多个属性进行排序,则另一种更灵活的好方法是使用Guava的Ordering类及其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 表达式和方法引用,这一切都会变得容易得多。您将能够编写类似这样的内容,而无需定义任何笨拙的匿名内部类或静态最终字段:
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 中仍然有用。 @StefanEndrullis:通过一个静态导入,Java 8 中的相同内容如下所示:people.sort(comparing(Person::lastName))
。看起来你有点低估了它。
好的,您最后通过静态导入comparing
进行的编辑使其也非常简短易读。感谢您的提示。【参考方案2】:
您需要写一个Comparator<MyObject>
并使用Collections.sort(List<T>, Comparator<? super T>
对您的List
进行排序。
否则,您的MyObject
也可以implements Comparable<MyObject>
,定义一个自然排序 来比较您的特定属性,然后改用Collections.sort(List<T>
。
另见
Java Tutorials/Object Ordering相关问题
根据各种标准对List
进行排序:
开启Comparator
和Comparable
【讨论】:
谢谢! :) 您能否详细说明比较器的使用以及它将如何根据字符串返回排序对象。请注意,我需要按字符串的字母顺序对它们进行排序。 哦。得到了关于比较器的想法。但由于其他一些问题,我无法在 Object 上实现此接口。所以我需要制作 Comparator 对象。 @Vishal:查看链接的问题(排序联系人的 ArrayList)。它有你正在寻找的例子等等。另外,Effective Java 2nd Edition,Item 12:考虑实现 Comparable以上是关于按对象属性对对象的 ArrayList 进行排序的主要内容,如果未能解决你的问题,请参考以下文章