2012-05-09 42 views
0

我知道TreeSet以排序方式存儲對象。但有沒有辦法可以自定義訂單?將TreeSet元素的順序更改爲自定義輸出

例如,如果我有一個TreeSet:

TreeSet t1 = new TreeSet(); 
    t1.add("c"); 
    t1.add("d"); 
    t1.add("a"); 

現在,如果我遍歷它>

Iterator it1 =t1.iterator(); 

    while(it1.hasNext()){ 
     Object o1 = it1.next(); 
     System.out.println(o1); 
    } 

我總是會得到的順序爲:a>c>d,但是我希望它返回訂單與我添加的元素相同,即c>d>a

回答

2

既然你提到關於被綁定使用TreeSet中,這樣的事情在我腦海中:

Set<String> result = new TreeSet<String>(new Comparator<String>(){ 
    @Override 
    public int compare(String arg0, String arg1) { 
     return returnCode(arg0).compareTo(returnCode(arg1)); 
    } 
}); 

其中:

private Integer returnCode(String p){ 
     int code = 0; 
     String id = p.toLowerCase(); 
     if ("a".equalsIgnoreCase(id)) code = 3; 
     else if ("b".equalsIgnoreCase(id)) code = 2; 
     else if ("c".equalsIgnoreCase(id)) code = 1; 
     //etc 
     return new Integer(code); 
} 

所以基本上你實現你自己的比較是什麼,但插入的字符串(我假設你已經知道)分配一定的整數值。

注意:此解決方案將無法正常工作,因爲您無法捕獲returnCode()方法中的選項。我假設你已經知道正在饋送給TreeSet的數據。

+0

你好,這是我在我的情況下所做的。 – 911TurboS

6

它使用LinkedHashSet

TreeSet各種元素,併爲字符串,各種基於自然順序(這是它比較是如何實現的),如果你要管理的插入順序,那麼你需要的用戶LinkedHashSet

,如果你不需要uniquness(一組功能),然後去List

+0

,但如果我實現我自己的比較,並覆蓋原有的一個,我認爲它會工作。沒有看到LinkedHashSet,讓我檢查,謝謝你的答案。 – 911TurboS

+0

'LinkedHashSet'是爲此目的而明確設計的,速度會更快。此外,你需要跟蹤插入順序的'比較器'類型必須是有狀態的,這對於那些只是作爲函子的東西來說不是一個好主意。使用LinkedHashSet去@Jigar是對的。 –

+0

@ sparc_spread,實際上感謝treeSet已經有一部分庫。現在,如果我去LInkedHashSet,我將不得不修改extenral庫作爲一個整體:(但我會嘗試,謝謝 – 911TurboS

1

這是更簡單:

TreeSet treeSetObj = new TreeSet(Collections.reverseOrder());