2014-04-29 27 views
6

有了這個代碼,我得到這樣的輸出:的java:TreeSet的順序

TreeSet<String> t=new TreeSet<String>(); 
    t.add("test 15"); 
    t.add("dfd 2"); 
    t.add("ersfd 20"); 
    t.add("asdt 10"); 


Iterator<String> it=t.iterator(); 

while(it.hasNext()){ 
    System.out.println(it.next); 
} 

我得到:

asdt 10 
    dfd 2 
    ersfd 20 
    test 15 

我怎樣才能得到這樣的順序,根據這些數字,與TreeSet的?

dfd 2 
    asdt 10 
    test 15 
    ersfd 20 
+4

使用比較。 – njzk2

+2

而不是像一個字符串中的「dfd 2」那樣的值。如果你把它放在一個java對象的兩個單獨的字段中(比如YourObject)會更好。 TreeSet t = new TreeSet (); – Jay

回答

5

TreeSet實現按照插入的字符串值的字典順序進行排序。如果您想按整數值排序,那麼您需要按照其他人的建議操作,並創建一個新對象並覆蓋compareTo方法,或者使用您自己的比較器。

Set<String> set = new TreeSet<String>(new Comparator<String>() { 
    public boolean equals(Object obj) { 
     // implement 
    } 
    public int compareTo(String one, String other) { 
     // implement 
    } 
}); 

public class MyClass implements Comparable { 
    private String key; 
    private int value; 

    public int compareTo(MyClass other) { 
     // implement 
    } 

    public boolean equals(MyClass other) { 
     // implement 
    } 

    // snip ... 
} 

Set<MyClass> set = new TreeSet<MyClass>(); 
+0

+1您是否閱讀過紀錄片? ; D –

+1

只是爲了檢查方法的簽名。 :-) – jgitter

+0

關於'equals',不應該重寫Object equals? – user7294900

0

使用接收自定義比較器的TreeSet構造函數,並實現一個對字符串進行不同排序的比較器。

下面是一個例子(未經測試,檢查使用前的代碼):

TreeSet<String> t = new TreeSet<String>(new Comparator<String>() { 
    public int compare(String s1, String s2) { 
     int spaceIndex1 = s1.indexOf(' '); 
     int spaceIndex2 = s2.indexOf(' '); 

     return Integer.parseInt(s1.substring(spaceIndex1 + 1)).compareTo(Integer.parseInt(s2.spaceIndex2 + 1)); 
    } 
}); 
+1

那還在做一個「字符串」比較,所以「20」會在「4」之前。他需要提取數字並進行數字比較。 –

+1

你說得對,我已經添加了修復程序。 – eitanfar

+0

是的,這將工作。雖然我會將它作爲「脆弱」代碼分類,因爲如果字符串格式稍有變化,可能會導致NumberFormatExceptions開始拋出。在這種情況下,這可能很好,但這取決於輸入數據的受限方式。 –

0

試試這個:

TreeSet set = new TreeSet(new Comparator<String>(){ 
    public int compare(String o1, String o2){ 
     String n1 = o1.split(" ")[1]; 
     String n2 = o2.split(" ")[1]; 
     return Integer.parse(n2) - Integer.parse(n1); 
    } 
    public boolean equals(String o1, String o2){ 
     return compare(o1,o2)==0; 
    } 
}); 
+1

這不是有效的java。另外,我會添加一些錯誤檢查。 – jgitter

+1

此代碼不能編譯/工作。 'Integer'類沒有'parse()'方法,'>'運算符返回'boolean',而不是'int'。 – eitanfar

+0

我會拋出一個異常像ArrayIndexOutOfBoundsException ...嘿代碼已經扔掉它。 ; d –

-1
class Book implements Comparable<Book> {  
    String name; 
    int id; 

    public Book(String name,int id) { 
     this.name = name; 
     this.id = id; 
    } 

    public int compareTo(Book b) { 
     if(id>b.id){ 
      return 1; 
     }else if(id<b.id){ 
      return -1; 
     }else{ 
      return 0; 
     } 
    } 
} 

public class TreeSet2 { 
    public static void main(String[] args) { 
     Set<Book> set=new TreeSet<Book>(); 

     //Creating Books 
     Book b1=new Book("test", 15); 
     Book b2=new Book("dfd", 2); 
     Book b3=new Book("ersfd", 20); 
     Book b4=new Book("asdt", 10); 

     //Adding Books to TreeSet 
     set.add(b1); 
     set.add(b2); 
     set.add(b3); 
     set.add(b4); 

     //Traversing TreeSet 
     for(Book b:set){ 
      System.out.println(b.name+" "+b.id); 
     } 
    } 
}