import java.util.*;public class TreeSetTest
{  
public static void main(String[] args)
{  
   SortedSet<Item> parts = new TreeSet<Item>();
   parts.add(new Item("Toaster", 1234));
   parts.add(new Item("Widget", 4562));
   parts.add(new Item("Modem", 9912));
   System.out.println(parts);   SortedSet<Item> sortByDescription = new TreeSet<Item>(new
      Comparator<Item>()
      {  
         public int compare(Item a, Item b)
         {  
            String descrA = a.getDescription();
            String descrB = b.getDescription();
            return descrA.compareTo(descrB);
         }
      });   sortByDescription.addAll(parts);
   System.out.println(sortByDescription);
}
}/**
An item with a description and a part number.
*/
class Item implements Comparable<Item>

/**
   Constructs an item.
   @param aDescription the item's description
   @param aPartNumber the item's part number
*/
public Item(String aDescription, int aPartNumber)
{  
   description = aDescription;
   partNumber = aPartNumber;
}/**
   Gets the description of this item.
   @return the description
*/
public String getDescription()
{  
   return description;
}public String toString()
{  
   return "[descripion=" + description
      + ", partNumber=" + partNumber + "]";
}public boolean equals(Object otherObject)
{  
   if (this == otherObject) return true;
   if (otherObject == null) return false;
   if (getClass() != otherObject.getClass()) return false;
   Item other = (Item) otherObject;
   return description.equals(other.description)
      && partNumber == other.partNumber;
}public int hashCode()
{  
   return 13 * description.hashCode() + 17 * partNumber;
}public int compareTo(Item other)
{  
   return partNumber - other.partNumber;
}private String description;
private int partNumber;
}
运行结果如下:[[descripion=Toaster, partNumber=1234], [descripion=Widget, partNumber=4562], [descripion=Modem, partNumber=9912]]
[[descripion=Modem, partNumber=9912], [descripion=Toaster, partNumber=1234], [descripion=Widget, partNumber=4562]]
我只了解Item类实现了Comparable接口, 然后重写了equals和hashCode方法
①:重写的hashCode方法 为什么要这样写13 * description.hashCode() + 17 * partNumber②:还有重写的compareTo方法 ,它return 的partNumber - other.partNumber是什么意思③:下列代码里面()里面实现的是什么:(new Comparator<Item>()
      {  
         public int compare(Item a, Item b)
         {  
            String descrA = a.getDescription();
            String descrB = b.getDescription();
            return descrA.compareTo(descrB);
         }
      })

解决方案 »

  1.   

    问题三:
    匿名内部类,本来是不能直接new一个接口的是吧?
    形式:接口 x=new 接口(){ public void 接口里要实现的方法(){
    }};
      

  2.   

    问题二:这个是根据业务来的,比如说比较两个"人类"的对象,你要如何设定它们的大小?根据年龄还是根据什么?
    问题中就是根据partNumber 属性来判断大小.问题一就是为了得到一个唯一的hashCoe值.只有当
    description和partNumber属性都相同的时候,两个对象的hashCode才相同 
      

  3.   

    1:
    hashcode这样写是为了让不同的Item对象尽量拥有不同的hashcode(虽然允许不同的对象有相同的hashcode),以提高未来将其放入散列表时的效率2:
    compareTo方法是Comparable接口定义的方法,必须实现,它必须返回一个整数,以反映两个进行比较的对象的大小关系,返回值大于0表示对象1大于对象2,否则相反。这个方法返回的结果可用于排序。这段代码中,以Item对象的partNumber属性来决定相互的大小比较关系3:
    TreeSet类允许使用参数为Comparator类型的构造方法,但Comparator只是一个接口,因此必须当场实现其中定义的compare方法,本段代码中,这个compare以Item对象的description属性来决定相互的大小比较关系。(注意,跟上面的CompareTo用的属性不同。
    整体上,这段代码演示了利用Comparable和Comapator进行的两种排序实现,两种排序分别利用了Item对象的2个不同属性来进行排序。