2014-04-29 17 views
6

Với mã này, tôi nhận được kết quả này:java: TreeSet trật tự

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); 
} 

tôi nhận được:

asdt 10 
    dfd 2 
    ersfd 20 
    test 15 

Làm thế nào tôi có thể nhận được một trật tự của loại hình này, dựa trên những con số, với TreeSet?

dfd 2 
    asdt 10 
    test 15 
    ersfd 20 
+4

sử dụng một so sánh. – njzk2

+2

Thay vì có các giá trị như "dfd 2" trong một chuỗi. Sẽ tốt hơn nếu bạn có nó trong 2 trường riêng biệt trong một đối tượng java (ví dụ YourObject). TreeSet t = new TreeSet (); – Jay

Trả lời

5

Việc triển khai TreeSet được sắp xếp theo thứ tự từ điển của các giá trị chuỗi bạn chèn. Nếu bạn muốn sắp xếp theo giá trị số nguyên, thì bạn sẽ cần phải làm như những người khác đề xuất và tạo một đối tượng mới và ghi đè lên phương thức compareTo, hoặc sử dụng bộ so sánh của riêng bạn.

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

hoặc

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 bạn đã đọc docu chưa? ; D –

+1

Chỉ cần kiểm tra chữ ký của các phương thức. :-) – jgitter

+0

về 'bằng', không nên ghi đè đối tượng bằng? – user7294900

0

Sử dụng trình tạo TreeSet để nhận Bộ so sánh tùy chỉnh và triển khai Bộ so sánh phân loại chuỗi khác nhau.

Dưới đây là một ví dụ (chưa được kiểm tra, kiểm tra mã trước khi sử dụng):

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

Vẫn đang thực hiện so sánh 'Chuỗi' để" 20 "sẽ xuất hiện trước" 4 ". Anh ta cần trích xuất số và thực hiện so sánh số. –

+1

Bạn nói đúng, tôi đã thêm bản sửa lỗi. – eitanfar

+0

Đúng, điều đó sẽ hoạt động. Mặc dù tôi muốn phân loại nó là "mong manh" mã trong đó nếu định dạng của các chuỗi thay đổi thậm chí một chút nó có thể gây ra NumberFormatExceptions để bắt đầu được ném. Điều đó có thể tốt trong trường hợp này nhưng nó phụ thuộc vào cách hạn chế dữ liệu đầu vào. –

2

Bạn có thể sử dụng một trong những TreeSet constructors: http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html#TreeSet%28java.util.Comparator%29

Điều này cho phép bạn chỉ định so sánh của riêng bạn mà cho phép bạn tổ chức các mục trong Set tuy nhiên bạn thích.

Thực hiện một Comparator rằng chiết xuất số lượng từ String và sau đó các loại bằng của số đầu tiên, chỉ có té ngửa ra một so sánh String nếu cả hai số đều bình đẳng.

0

Hãy thử điều này:

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

Đó không phải là java hợp lệ. Ngoài ra, tôi sẽ thêm một số kiểm tra lỗi. – jgitter

+1

Mã này không biên dịch/làm việc. Không có phương thức 'parse()' cho lớp 'Integer', và toán tử'> 'trả về' boolean', không phải 'int'. – eitanfar

+0

Tôi sẽ ném một ngoại lệ như ArrayIndexOutOfBoundsException ... hey mã đã ném nó. ; 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); 
     } 
    } 
} 
Các vấn đề liên quan