2010-10-21 43 views
0

我有一個訂單對象列表。每個訂單對象有5個實例變量。有沒有一種方法可以基於這些instace變量對這個列表進行排序?我需要實現可比的界面。但在那種情況下,我怎麼能排序一個特定的變量?基於實例變量的排序列表java

+0

它們是什麼樣的變量?原語?如果是這樣,你只需要在compareTo方法中比較它們(你說你會實現Comparable接口)。 – Cristian 2010-10-21 04:23:39

+0

你的意思是多個字段順序?就像SQL'a,b,c'的順序一樣。 – 2010-10-21 04:25:59

回答

4

你可以在這樣的類定義staticComparator S,

public static final Comparator<Order> NAME_COMPARATOR = Comparator<Order>(){ 
           public int compare(Order o1, Order o2) { 
            // provide an impl here using order name 
           } 
          } 

public static final Comparator<Order> ID_COMPARATOR = Comparator<Order>(){ 
           public int compare(Order o1, Order o2) { 
            // provide an impl here using order id 
           } 
          } 

再經過這些排序時這樣,

Collections.sort(list, Order.NAME_COMPARATOR); 
Collections.sort(list, Order.ID_COMPARATOR); 
1

你的問題有很多含糊之處。這是一個5場類的例子。本課程使用Comparable進行排序,在這種情況下,按字段a排序,然後按字段b排序,並且如果ab是相同的,那麼這兩個排序順序相同。如果實施Comparable,則可能還需要執行equals(),並確保它符合Comparable接口規範的要求。有關詳細信息,另請參閱javapractices.com "implementing compareTo()"

工作例如:

import java.util.Arrays; 

class SortableThing implements Comparable<SortableThing> 
{ 
    final String foo; 
    final int a, b, c, d, e; 

    public SortableThing(String foo, int a, int b, int c, int d, int e) 
    { 
    this.foo = foo; this.a = a; 
    this.b = b;  this.c = c; 
    this.d = d;  this.e = e; 
    } 

    @Override 
    public int compareTo(SortableThing o) 
    { 
    if (this.a != o.a) 
     return this.a - o.a; 
    else if (this.b != o.a) 
     return this.b - o.b; 
    else return 0; 
    } 

    @Override 
    public boolean equals(Object o) 
    { 
    if (!(o instanceof SortableThing)) return false; 
    SortableThing st = (SortableThing)o; 
    return st.a == this.a && st.b == this.b; 
    } 

    @Override 
    public String toString() 
    { 
    return new StringBuilder().append(foo).append(": <").append(a) 
    .append(',').append(b) 
    .append(',').append(c) 
    .append(',').append(d) 
    .append(',').append(e).append('>').toString(); 
    } 

    public static void main(String[] args) 
    { 
    final SortableThing one, two, three, four; 
    one = new SortableThing("one", 4, 2, 42, 42, 42); 
    two = new SortableThing("two", 2, 3, 42, 42, 42); 
    three = new SortableThing("three", 2, 2, 42, 42, 42); 
    four = new SortableThing("four", 1, 50, 42, 42, 42); 
    SortableThing[] list = new SortableThing[] {one,two,three,four}; 
    System.out.println("Before: "+Arrays.deepToString(list)); 
    Arrays.sort(list); 
    System.out.println("After: "+Arrays.deepToString(list)); 
    } 
} 

輸出:

Before: [one: <4,2,42,42,42>, two: <2,3,42,42,42>, three: <2,2,42,42,42>, four: <1,50,42,42,42>] 
After: [four: <1,50,42,42,42>, three: <2,2,42,42,42>, two: <2,3,42,42,42>, one: <4,2,42,42,42>] 
0

如果你的意思是'order by a,b,c',我寫了一個博客來解決它:對java.util.List多字段排序。請參閱第二段代碼,對不起,它是'中文,但代碼和評論是英語:)

0

假設您有實例變量的「獲取」方法,您可以使用Bean Comparator,因此您不必編寫自定義代碼。

+0

解釋downvote?給出理由讓人們可以自己決定。 – camickr 2010-10-21 05:19:11

+0

但是我需要用英語和德語對這兩種語言進行排序.....這個類可以嗎? – apoorvabade 2010-10-21 08:41:25

1

在斯卡拉你可以做到這一點非常優雅。

val sortedOrders = orders.sortBy(o => (o.a, o.b, o.c)) 

通過排序orders列表中的字段a,再通過現場b,然後通過現場c