2012-11-18 31 views
1

我有以下代碼: 我想在TreeSet中插入Item對象,我沒有得到慾望輸出。java:樹集合和可比接口

public class Main 
{ 
    public static void main(String a[]) 
    { 
     Item i1=new Item(1,"aa"); 
     Item i2=new Item(5,"bb"); 
     Item i3=new Item(10,"dd"); 
     Item i4=new Item(41,"xx"); 
     Item i5=new Item(3,"x5"); 
     TreeSet t=new TreeSet();  
     t.add(i1); 
     t.add(i2); 
     t.add(i3); 
     t.add(i4); 
     t.add(i5); 
     System.out.println(t);  
    } 
} 
class Item implements Comparable<Item> 
{ 
    String nm; 
    int price; 
    public Item(int n,String nm) 
    { 
     this.nm=nm; 
     price=n; 
    } 
    public int compareTo(Item i1) 
    { 
     if(price==i1.price) 
      return 0; 
     else if(price>=i1.price) 
      return 1; 
     else 
      return 0; 
    } 
    public String toString() 
    { 
     return "\nPrice "+price+" Name : "+nm; 
    }  
} 

輸出:

[價格1名稱:AA,
價格5名稱:BB,
價格10名稱:DD,
價格41名稱:XX]

Item i5=new Item(3,"x5");是不是插入了爲什麼?
爲什麼我可以在TreeSet中插入。

+0

你的TreeSet大小是多少? –

回答

3

您尚未正確實施compareTo()。下面是從javadoc中的摘錄:

Compares this object with the specified object for order. Returns a negative integer, 
zero, or a positive integer as this object is less than, equal to, or greater than 
the specified object. 

你的實現並不當前對象的情況下,價格不到你比較對象的價格回報-1

2

在你的compareTo方法你應該有else return -1;

2

compareTo取代:

else 
     return 0; 

有:

else 
     return -1; 
2

類實現Comparable必須遵守合同:如果a.compareTo(b) < 0然後b.compareTo(a) > 0。你的不遵守。

0

主要問題在於你的compareTo方法。你已經實現了一個錯誤的邏輯。我已經修改了你的類並在我的eclipse中進行了測試,它給出了期望的輸出。看下面的代碼。

import java.util.TreeSet; 
public class Main 
{ 
    public static void main(String a[]) 
    { 
     Item i1=new Item(1,"aa"); 
     Item i2=new Item(5,"bb"); 
     Item i3=new Item(10,"dd"); 
     Item i4=new Item(41,"xx"); 
     Item i5=new Item(3,"x5"); 
     TreeSet<Item> t=new TreeSet<Item>();  
     t.add(i1); 
     t.add(i2); 
     t.add(i3); 
     t.add(i4); 
     t.add(i5); 
     System.out.println(t);  
    } 
} 
class Item implements Comparable<Item> 
{ 
    String nm; 
    int price; 
    public Item(int n,String nm) 
    { 
     this.nm=nm; 
     price=n; 
    } 
    public int compareTo(Item i1) 
    { 
     // Objects equal so no need to add 
     if(price==i1.price) 
     { 
      return 0; 
     } 
     // Object are greater 
     else if(price>i1.price) 
     { 

      return 1; 
     } 
     // Object is lower 
     else 
     { 
      return -1; 
     } 
    } 
    public String toString() 
    { 
     return "\nPrice "+price+" Name : "+nm; 
    }  
}