2014-10-22 47 views
-1

我有一個預先定義的元組類不能被修改如下預定義的類進行排序的元組的一個陣列:如何如果元組是沒有實現比較器的Java

public class Tuple { 
    protected String name; 
    public Tuple(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 
} 

我有其他類它定義了上述元組的數組:

public class Stack { 
    protected ArrayList<Tuple> tupleLst; 
    public Stack(){ 
     this.tupleLst=new ArrayList<Tuple>(10); 
    } 
} 

然後我需要元組的陣列中的另一個類進行排序:例如:

public class Algo { 
    public static int Sort(Relation r){ 

    } 
    public static void main(String[] arg){ 
    Algo.Sort(); 
} 

關係r是元組的輸入數組。我在網上搜索,在那裏我看到很多人實際上正在使用Comparators和Collections.sort()來做到這一點。但是,在我嘗試之後,我注意到Tuple類需要實現比較器才能進行排序。如何在不更改前兩個類的情況下對元組進行排序?先謝謝你!

+0

問題應該是:你爲什麼不改變前兩個班? – Tom 2014-10-22 09:09:22

+0

你錯了:'比較器'是一個單獨的策略界面。你不必碰你的課。 – 2014-10-22 09:09:35

回答

3

雖然Tuple不能被修改,就可以實現自己的Comparator,然後將它傳遞給Collections.sort()方法(它會做一個排序的基礎上,比較規則(一個或多個)元組的集合,例如:

Comparator<Tuple> myComparator = new Comparator<Tuple>() { 
    public int compare(Tuple t1, Tuple t2) { 
     //the comparison rules go here 
    } 
}; 
Collections.sort(tupleList, myComparator); 

如果使用Java8,你可以在一行中實現這一點:

myList.sort((t1, t2) -> { <comparison rules implementation> }); 

或(感謝@MarkoTopolnik)

myList.sort(Comparator.comparing(t -> <<get sort key from t>>) 
+0

更簡單:'sort(Comparator.comparing(t - ><< get sort key from t >>)' – 2014-10-22 09:29:46

0

我覺得你混淆了兩種方法。一種方法是讓你的Tuple類實現Comparable接口。我認爲這是你想避免的,因爲你似乎不想修改Tuple類。

另一種方法是定義一個新的類,其目的是比較兩個元組。這就是所謂的比較器。如果你傳遞了你的元組列表和這個比較器的一個實例,那麼你可以按照你喜歡的方式對你的元組進行排序,而無需修改Tuple類。