按名字排序列表,但如果第二个名称相同,则按名字排序

时间:2017-04-24 13:33:53

标签: java sorting

我想构建一个按第二个名称对列表进行排序的方法,但是如果我有两个具有第二个名称的类似对象,我的方法按名字排序只有相似的对象。

例如,这是我的清单:

 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;相同的第二个名字,则此方法按名字排序。

有一种简单的方法吗?

3 个答案:

答案 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。