2017-04-24 42 views
0

我想建立一个方法来按第二个名称排序列表,但如果我有两个类似的对象与第二个名称,我的方法排序只命名类似的对象。第二个名字排序列表,但如果第二个名字是相同的,按名排序

例如,这是我的名单:

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; 

当我有像“赛艇”,这种方法通过各种名字相同的第二个名字。

有没有简单的方法来做到这一点?

+0

你累了什么?至今 ? –

+0

对一个对象进行排序本质上是一个基本的事情,实现['Comparator'](http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html)接口。互联网上有很多关于这个界面的信息。 – KarelG

回答

2

您需要使用自定义Comparator

比较函数强行对某些对象collection进行整体排序。可以将比较器传递给排序方法(如Collections.sort或Arrays.sort),以便精确控制排序顺序。

Comparator以下的实现自java 1.2开始有效。 从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 
+0

位短:'Collections.sort(p,Comparator.comparing((Person p) - > p.getSecondName())。thenComparing((Person p) - > p.getFirstName));' –

+0

谢谢大家,它确实工作:) – firstontheworld

1

你可能需要类似的东西(你没有提供Person豆细节,所以干将的名字只是我的猜测):

p.sort((o1, o2) -> { 
     int sc = o1.getSname().compareTo(o2.getSname()); 
     return sc != 0 ? sc : o1.getFname().compareTo(o2.getFname()); 
    }); 
0

你的个人目标应该实现可比接口:

实现此接口的对象的列表(和数组)可以由Collections.sort(和Arrays.sort)自动排序。实现此接口的对象可用作有序映射中的键或排序集中的元素,而无需指定比较器。

对于C类的自然排序被称为与等号一致当且仅当e1.compareTo(e2)== 0与e1.equals(e2)具有相同的布尔值(对于每个e1和e2)注意,null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(null)也应抛出NullPointerException。

相关问题