2011-03-15 78 views
2

我有一個數組列表排序的ArrayList

ArrayList itemListWithRank = ItemListDAO.getItemList(); 

和ArrayList中itemListWithRank有很多類型的對象的值。這些都是不同的。而且它們中的一個值就是用該數組列表設置的項目等級。

現在我想根據排名的增強順序對這個數組列表進行排序。秩值已經在這個數組列表中設置。

我該如何排列arraylist哪一個有很多值的類型....?

感謝所有....

+1

請給ArrayList的內容的一個例子。 – 2011-03-15 08:32:03

+0

列表中的這些對象是否有共同點?一些常見的接口或基類?排名如何存儲在列表中?你能舉一個例子嗎? – 2011-03-15 08:32:08

+0

你使用泛型?你的ArrayList是如何聲明的?什麼是列表中的對象的類型? – 2011-03-15 08:33:19

回答

6

使他們成爲一個類型的所有對象。或者設計一個共同的基類或Interface

然後

使用Comparator將它們挑選出

例如。

public class SortableFields{ 
    protected long rank; 
    //accessors methods 
} 

假設數組列表中的所有對象都SortableFields現在

現在

Collections.sort(list,new Comparator(){ 
public int compareTo(Object ob1,Object ob){ 
    return ((SortableFild)ob1.getRank())-((SortableFild)ob2.getRank()) 
} 
}); 

或者使用反射劈,不可取

Collections.sort(list,new Comparator(){ 
public int compareTo(Object ob1,Object ob){ 
    UtilClass.getRank(ob1)-UtilClass.getRank(ob);  
} 
}); 

在你UtilClass

public int getRank(Object ob){ 

     Class cl=ob1.getClass(); 
     Method mthd=cl.getMethod("getRank"); 
     Integer output=(Integer)mthd1.invoke(ob); 
     return output; 

} 
+0

謝謝Jigar .........非常感謝...... – water 2011-03-15 08:49:49

+0

歡迎您:) – 2011-03-15 08:50:25

+0

老實說,對於這樣一個基本問題,我甚至不會提到反射方法。 **如果**你需要發佈它,那麼至少提取一個'getRank(Object)'方法並且不要複製代碼;-) – 2011-03-15 09:45:00

4

使用Collections.sort(List<T> list, Comparator<? super T> c),並通過您的DAO對象的自定義比較。

如果您的所有列表項目共享一個提供獲取項目等級的方法的公共超類型,那就更容易了。假設你有這樣的接口,我們稱之爲RankProvider,比較可能看起來像:

public class Comparator<RankProvider> { 
    @Override 
    public int compare(RankProvider o1, RankProvider o2) { 
    return o1.getItemRank().compareTo(o2.getItemRank()); 
    } 
} 

通過這個比較的一個實例,或定義一個匿名類。

- 的例子給出上述假定,該項目秩或者是Java原始(如int)或字符串或,換句話說,是一個Comparable(直接或inboxing之後)


如果您沒有共同的超類或接口,那麼比較並不重要。你要麼知道所有可能的類型和處理它們每個或每個或你知道所有類型都有相同的方法(名稱),你可以反映排名。對於比較清楚,但隨機類型的比較一個例子:

public class Comparator { // no generics this time 
    @Override 
    public int compare(Object o1, Object o2) { 
    Object[] comparables = new Object{o1, o2}; 
    int[] ranks = new int[2]; 

    for (int i = 0; i < 2; i++) { 
     if (comparables[i] instanceof MyType1) { 
     ranks[i] = ((MyType1) comparables[i]).getRank(); // rank getter for MyType1 type 
     continue; 
     } 

     if (comparables[i] instanceof MyType2) { 
     ranks[i] = ((MyType2) comparables[i]).getRank(); // rank getter for MyType2 type 
     continue; 
     } 

     // ... 
    } 
    return ranks[0] - ranks[1]; // ascending order 
    } 
} 

如果你沒有機會去重構你的DAO實現共享接口,可以這樣做。

+0

**注**,有很多類型的對象值都是不同的。 – 2011-03-15 08:34:58

+0

@Jigar--我已經處於改進模式;) – 2011-03-15 08:37:44

0

首先,在ArrayList中的每個對象必須具有一些共同的父自己層次結構或者實現一個界面來定義獲得排名的方式。例如,所有的人都必須實現此接口:

interface Rankable { 
    public int getRank(); 
} 

的您可以創建自定義Comparator

Comparator<Rankable> myComparator = new Comparator<Rankable>() { 
    public int compare(Rankable o1, Rankable o2) { 
     return o1.getRank() - o2.getRank(); 
    } 
    public equals(Object obj) { 
     return obj == this; 
    } 
} 

最後排序您的ArrayList:

Collections.sort(itemListWithRank, myComparator); 

您也可以implements ComparableArrayList中的所有對象中,然後是遺留排序方法,但如果您計劃在d對他們進行其他類型的比較。

2
Collections.sort(itemListWithRank ,new Comparator<Person>() { 

    public int compare(Person o1, Person o2) { 
     return Integer.valueOf(o1.id).compareTo(Integer.valueOf(o2.id)); 
    } 
}); 
1

考慮使用lambdaj,這使得該構造

List<Person> sorted = sort(persons, on(Person.class).getAge());