要解決這個(gè)異常錯(cuò)誤有兩種解決辦法。第一種在構(gòu)造TreeMap時(shí)指定一個(gè)比較器,這個(gè)比較器用于比較兩個(gè)值,并且返回一個(gè)整數(shù)值作為他們的比較結(jié)果。第二種就是key實(shí)現(xiàn)Comparable接口。
publicMap> getTreeMap(){
TreeMap>(
//比較器按照降序?qū)崿F(xiàn)
public int compare(Order order1, Order order2)
{
return
order2.getOrderId().compareTo(order1.getOrderId());
其中的Order就是需要排序的類(lèi),里面的orderId就是需要排序的變量。
簡(jiǎn)單的說(shuō),HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是兩個(gè)對(duì)象通過(guò)equals方法比較相等,并且兩個(gè)對(duì)象的hashCode()方法返回值相等
注意,如果要把一個(gè)對(duì)象放入HashSet中,重寫(xiě)該對(duì)象對(duì)應(yīng)類(lèi)的equals方法,也應(yīng)該重寫(xiě)其hashCode()方法。其規(guī)則是如果兩個(gè)對(duì)象通過(guò)equals方法比較返回true時(shí),其hashCode也應(yīng)該相同。另外,對(duì)象中用作equals比較標(biāo)準(zhǔn)的屬性,都應(yīng)該用來(lái)計(jì)算hashCode的值。 看下面的例子!
如果讓我們實(shí)現(xiàn)這個(gè)程序的話 但由于hashSet判斷元素相等是按照默認(rèn)的方法來(lái)的??! 所以我們應(yīng)該重寫(xiě)equals!并且hashcode也要一樣?。?nbsp; 另外 1、Treeset中的數(shù)據(jù)是自動(dòng)排好序的,不允許放入null值 2、HashSet中的數(shù)據(jù)是無(wú)序的,可以放入null,但只能放入一個(gè)null,兩者中的值都不能重復(fù),就如數(shù)據(jù)庫(kù)中唯一約束 3 TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類(lèi),TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet支持兩種排序方式,自然排序和定制排序,其中自然排序?yàn)槟J(rèn)的排序方式。向TreeSet中加入的應(yīng)該是同一個(gè)類(lèi)的對(duì)象。 TreeSet判斷兩個(gè)對(duì)象不相等的方式是兩個(gè)對(duì)象通過(guò)equals方法返回false,或者通過(guò)CompareTo方法比較沒(méi)有返回0 也就是如果對(duì)對(duì)象進(jìn)行排序儲(chǔ)存的話從,必須對(duì)象類(lèi)要實(shí)現(xiàn)equals\compareTo 如果用compareTo則需要對(duì)象類(lèi)實(shí)現(xiàn)Comparable!如果不實(shí)現(xiàn)的話! 則
自然排序 自然排序使用要排序元素的CompareTo(Object obj)方法來(lái)比較元素之間大小關(guān)系,然后將元素按照升序排列。 Java提供了一個(gè)Comparable接口,該接口里定義了一個(gè)compareTo(Object obj)方法,該方法返回一個(gè)整數(shù)值,實(shí)現(xiàn)了該接口的對(duì)象就可以比較大小。 obj1.compareTo(obj2)方法如果返回0,則說(shuō)明被比較的兩個(gè)對(duì)象相等,如果返回一個(gè)正數(shù),則表明obj1大于obj2,如果是負(fù)數(shù),則表明obj1小于obj2。 如果我們將兩個(gè)對(duì)象的equals方法總是返回true,則這兩個(gè)對(duì)象的compareTo方法返回應(yīng)該返回0 定制排序 自然排序是根據(jù)集合元素的大小,以升序排列,如果要定制排序,應(yīng)該使用Comparator接口,實(shí)現(xiàn) int compare(T o1,T o2)方法
java.lang.Comparable
實(shí)現(xiàn)類(lèi)基于 這個(gè)接口有什么用呢?
如果一個(gè)數(shù)組中的對(duì)象實(shí)現(xiàn)了
Comparable 其中
this <
obj
this =
obj
this >
obj
即將當(dāng)前這個(gè)對(duì)象與指定的對(duì)象進(jìn)行順序比較,當(dāng)該對(duì)象小于、等于或大于指定對(duì)象時(shí),分別返回一個(gè)負(fù)整數(shù)、
其實(shí),有兩種方式可以進(jìn)行集合排序
Comparator
comparable 前者應(yīng)該比較固定,和一個(gè)具體類(lèi)相綁定,而后者比較靈活,它可以被用于各個(gè)需要比較功能的類(lèi)使用??梢哉f(shuō)前者屬于“靜態(tài)綁定”,而后者可以“動(dòng)態(tài)綁定”。
一個(gè)類(lèi)實(shí)現(xiàn)了
而
2.
例如: (1) Person.java public class Person implements java.lang.Comparable{
} (2) TestComparable.java import java.util.TreeSet; import java.util.Iterator;
public class TestComparable{
} 運(yùn)行結(jié)果:
Id:
1001
Id:
1003
Id:
1008
Id:
1015 |
|