2017-04-24 40 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。

相關問題