2009-02-16 35 views
20

假設我有叫Foo的用戶定義的Java類,如Java集合:按字母順序排序基於其成員的項目「的toString的價值

public class Foo 
{ 

    private String aField; 

    @Override 
    public String toString() 
    { 
     return aField; 
    } 

} 

和如集合:

List<Foo> aList; 

我想要做的是根據每個成員的返回'.toString()'值按字母順序對列表進行排序。

我嘗試過使用Collections.sort()方法,但結果並不是我所嘗試的。 爲了完成這個,我需要做些什麼?

回答

17

使用指定比較器的API sort(List list, Comparator c),並且實現如您所願。

或者,如果您不特別需要列表,請使用SortedSet,與比較器相同。

1

如果您希望集合保持排序狀態,而不是在特定點對其進行排序,則可以將其放入具有定義的比較器的TreeSet中。否則,我會使用Yuval已經提到的Collections.sort方法。

+0

已經編輯我的帖子中提及的SortedSet;) – 2009-02-16 22:13:52

6
public class Foo 
    implements Comparable<Foo> 
{ 

    private String aField; 

    public Foo(String s) 
     { 
     aField=s; 
     } 


    public String getAField() 
     { 
     return aField; 
     } 

    public int compareTo(Foo other) 
     { 
     return getAField().compareTo(other.getAField()); 
     } 


    @Override 
    public String toString() 
    { 
    return getAField(); 
    } 

} 

然後

Collections.sort(列表);

58
Collections.sort(fooList, 
       new Comparator<Foo>() 
       { 
        public int compare(Foo f1, Foo f2) 
        { 
         return f1.toString().compareTo(f2.toString()); 
        }   
       }); 

假設toString永不返回null,並且列表中沒有空項目。

+0

具體打字比較器作爲提問者只是想比較兩個可能是不必要的對象由toString。在我看來,這種類型可能是不必要的。 – 2009-02-16 22:21:51

+0

@Nathan。是的,泛型類型不需要比Object更具體。你不必像我一樣定義比較器。 – 2009-02-16 22:25:48

3

我會強烈建議你只使用的toString爲了調試的目的......但是......到什麼尤瓦一個上面寫的擴大......

 
public class X 
    implements Comparator 
{ 
    public int compare(final Foo a, final Foo b) 
    { 
     return (a.toString().compareTo(b.toString())); 
    } 
} 

但是你真的應該有富落實Comarable或寫一個不使用toString的適當的Compartor。

5

我會做的非常相似,皮埃爾的東西:

public class Foo implements Comparable<Foo> 
{ 
    private String aField; 

    @Override 
    public String toString() 
    { 
     return aField; 
    } 

    public int compareTo(Foo o) 
    { 
     return this.toString().compareTo(o.toString()); 
    } 
} 

然後,像皮埃爾,我會用Collections.sort(list)皮埃爾建議。

2

lambdaj允許您排序,過濾和一般操作集合,無需編寫循環或隱藏內部類。例如排序你問可以,因爲它遵循來實現:

sort(foos, on(Foo.class).toString()); 

如果您對它感興趣檢查出來的:

http://code.google.com/p/lambdaj/

14

google-collections使得這真的Ordering容易:

Collections.sort(list, Ordering.usingToString()); 

引入一個完整的第三方庫只是爲了使用你可以使用Compara輕鬆編寫的東西tor(正如其他人所提供的)值得嗎?不,但谷歌收藏是如此之酷,無論如何,因爲其他一些原因,你會想要它。

在排序前,你也可以輕鬆地做這樣的事情逆轉:

Ordering.usingToString().reverse(); 

或打破僵局:

Ordering.usingToString().compound(someOtherComparator); 

或處理空值:

Ordering.usingToString().nullsFirst(); 

等。 ,但是那裏有更多的東西(當然不只是排序相關的東西),這會導致真正的表達代碼。一探究竟!

2

Java的版本8:

list.sort(Comparator.comparing(Object::toString)); 

或流:

List<Foo> sortedList = unsortedList 
    .stream() 
    .sorted(Comparator.comparing(Object::toString))) 
    .collect(Collectors.toList());