我想构建一个按第二个名称对列表进行排序的方法,但是如果我有两个具有第二个名称的类似对象,我的方法按名字排序只有相似的对象。
例如,这是我的清单:
List<Person> p = new ArrayList<Person>();
p.add(new Person("Konrath", "Will"));
p.add(new Person("Pavol","Rower"));
p.add(new Person("Abie", "Backi"));
p.add(new Person("Bartie", "Rower"));
return p;
我想要这样的结果:
List<Person> p = new ArrayList<Person>();
p.add(new Person("Abie", "Backi"));
p.add(new Person("Bartie", "Rower"));
p.add(new Person("Pavol", "Rower"));
p.add(new Person("Konrath","Will"));
return p;
如果我有与#34; Rower&#34;相同的第二个名字,则此方法按名字排序。
有一种简单的方法吗?
答案 0 :(得分:2)
您需要使用自定义Comparator
:
比较函数,它对某些对象集合施加总排序。可以将比较器传递给排序方法(例如Collections.sort或Arrays.sort),以便精确控制排序顺序。
自java 1.2以来有效的Comparator
实现。
从Java 8开始,Robin Topper评论可以实现更短的实现。
public class SecondThanFirstComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
// Handle nulls
if (p1.getSecondName().equals(p2.getSecondName())) {
return p1.getFirstName().compareTo(p2.getFirstName());
} else {
return p1.getSecondName().compareTo(p2.getSecondName());
}
return 0;
}
}
List<Person> p = ...;
...
Collections.sort(p, new SecondThanFirstComparator());
// From here p list is sorted
答案 1 :(得分:1)
您可能需要类似的东西(您没有提供Person
bean详细信息,因此getter名称只是我的猜测:
p.sort((o1, o2) -> {
int sc = o1.getSname().compareTo(o2.getSname());
return sc != 0 ? sc : o1.getFname().compareTo(o2.getFname());
});
答案 2 :(得分:0)
您的person对象应该实现类似的界面:
实现此接口的对象的列表(和数组)可以由Collections.sort(和Arrays.sort)自动排序。实现此接口的对象可用作有序映射中的键或有序集中的元素,而无需指定比较器。
当且仅当e1.compareTo(e2)== 0与c1的每个e1和e2的e1.equals(e2)具有相同的布尔值时,C类的自然排序被认为与equals一致。请注意,null不是任何类的实例,并且e.compareTo(null)应该抛出NullPointerException,即使e.equals(null)返回false。