免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
cannot be cast to java.lang.Comparable解決辦法
要解決這個(gè)異常錯(cuò)誤有兩種解決辦法。第一種在構(gòu)造TreeMap時(shí)指定一個(gè)比較器,這個(gè)比較器用于比較兩個(gè)值,并且返回一個(gè)整數(shù)值作為他們的比較結(jié)果。第二種就是key實(shí)現(xiàn)Comparable接口。
publicMap> getTreeMap(){
Map> map =new
TreeMap>(
//比較器按照降序?qū)崿F(xiàn)
(Comparator) new Comparator(){
public int compare(Order order1, Order order2){
returnorder2.getOrderId().compareTo(order1.getOrderId());
}
}
);
returnmap;
}
其中的Order就是需要排序的類,里面的orderId就是需要排序的變量。
簡單的說,HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是兩個(gè)對(duì)象通過equals方法比較相等,并且兩個(gè)對(duì)象的hashCode()方法返回值相等
注意,如果要把一個(gè)對(duì)象放入HashSet中,重寫該對(duì)象對(duì)應(yīng)類的equals方法,也應(yīng)該重寫其hashCode()方法。其規(guī)則是如果兩個(gè)對(duì)象通過equals方法比較返回true時(shí),其hashCode也應(yīng)該相同。另外,對(duì)象中用作equals比較標(biāo)準(zhǔn)的屬性,都應(yīng)該用來計(jì)算hashCode的值。
看下面的例子!
Java代碼
hashSetSorted hss3=new hashSetSorted(3,"a");
hashSetSorted hss4=new hashSetSorted(3,"a");
//System.out.println(hss3.equals(hss4));
//System.out.println(hss3.compareTo(hss4)==0);
HashSet hs=new HashSet();
hs.add(hss3);
hs.add(hss4);
System.out.println(hs);
如果讓我們實(shí)現(xiàn)這個(gè)程序的話 按我們的思路一定認(rèn)為這樣的輸入應(yīng)該是輸入的重復(fù)值!
但由于hashSet判斷元素相等是按照默認(rèn)的方法來的??!
所以我們應(yīng)該重寫equals!并且hashcode也要一樣?。?div style="height:15px;">
另外
1、Treeset中的數(shù)據(jù)是自動(dòng)排好序的,不允許放入null值
2、HashSet中的數(shù)據(jù)是無序的,可以放入null,但只能放入一個(gè)null,兩者中的值都不能重復(fù),就如數(shù)據(jù)庫中唯一約束
3  TreeSet類
TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet支持兩種排序方式,自然排序和定制排序,其中自然排序?yàn)槟J(rèn)的排序方式。向TreeSet中加入的應(yīng)該是同一個(gè)類的對(duì)象。
TreeSet判斷兩個(gè)對(duì)象不相等的方式是兩個(gè)對(duì)象通過equals方法返回false,或者通過CompareTo方法比較沒有返回0
也就是如果對(duì)對(duì)象進(jìn)行排序儲(chǔ)存的話從,必須對(duì)象類要實(shí)現(xiàn)equals\compareTo
如果用compareTo則需要對(duì)象類實(shí)現(xiàn)Comparable!如果不實(shí)現(xiàn)的話!
Java代碼
TreeSet ts2=new TreeSet();
diyHashSet dh=new diyHashSet(1,"1");
diyHashSet dh2=new diyHashSet(2,"1");
diyHashSet dh3=new diyHashSet(3,"1");
ts2.add(dh);
ts2.add(dh2);
//執(zhí)行到這里是爆出異常?。annot be cast to java.lang.Comparable 因?yàn)門reeset的add方法對(duì)象時(shí)實(shí)現(xiàn)comparable接口的方法!他沒有實(shí)現(xiàn)!在檢查時(shí)報(bào)異常?。?div style="height:15px;">
ts2.add(dh3);
自然排序
自然排序使用要排序元素的CompareTo(Objectobj)方法來比較元素之間大小關(guān)系,然后將元素按照升序排列。
Java提供了一個(gè)Comparable接口,該接口里定義了一個(gè)compareTo(Objectobj)方法,該方法返回一個(gè)整數(shù)值,實(shí)現(xiàn)了該接口的對(duì)象就可以比較大小。
obj1.compareTo(obj2)方法如果返回0,則說明被比較的兩個(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,To2)方法
java.lang.Comparable 接口定義的 compareTo() 方法用于提供對(duì)其實(shí)現(xiàn)類的對(duì)象進(jìn)行整體排序所需要的比較邏輯。
實(shí)現(xiàn)類基于 compareTo() 方法的排序被稱為自然排序。而 compareTo() 方法的排序被稱為它的自然排序。具體的排序原則可由實(shí)現(xiàn)類根據(jù)需要而定。用戶在重寫 compareTo() 方法以定制比較邏輯時(shí),需要確保其余等價(jià)性判斷方法 equals() 保持一致,即 e1.equals((Object)e2) 和e1.compareTo((Object)e2)==0 具有相同的值,這樣的話我們就稱自然順序就和 equals 一致。
這個(gè)接口有什么用呢?
如果一個(gè)數(shù)組中的對(duì)象實(shí)現(xiàn)了 Compareable 接口,則對(duì)這個(gè)數(shù)組進(jìn)行排序非常簡單: Arrays.sort(); 如果 List 實(shí)現(xiàn)了該接口的話 , 我們就可以調(diào)用Collections.sort 或者 Arrays 方法給他們排序。實(shí)際上 Java 平臺(tái)庫中的所有值類 (valueclasses) 都實(shí)現(xiàn)了 Compareable 接口。
Comparable 接口只有一個(gè)方法 compareTo(Object obj)
其中
this <obj   返回負(fù)
this =obj   返回 0
this >obj   返回正
即將當(dāng)前這個(gè)對(duì)象與指定的對(duì)象進(jìn)行順序比較,當(dāng)該對(duì)象小于、等于或大于指定對(duì)象時(shí),分別返回一個(gè)負(fù)整數(shù)、 0 或正整數(shù),如果無法進(jìn)行比較,則拋出ClassCastException 異常。
其實(shí),有兩種方式可以進(jìn)行集合排序 :
1. 集合中對(duì)象的所屬類實(shí)現(xiàn)了 java.lang.Comparable 接口
2. 為集合指定比較器 java.lang.Comparator 的實(shí)現(xiàn)類
Comparator , Comparable 接口的區(qū)別是:
comparable 是通用的接口,用戶可以實(shí)現(xiàn)它來完成自己特定的比較,而 comparator 可以看成一種算法的實(shí)現(xiàn),在需要容器集合 collection 需要比較功能的時(shí)候,來指定這個(gè)比較器,這可以看出一種設(shè)計(jì)模式,將算法和數(shù)據(jù)分離,就像 C++ STL 中的函數(shù)對(duì)象一樣。
前者應(yīng)該比較固定,和一個(gè)具體類相綁定,而后者比較靈活,它可以被用于各個(gè)需要比較功能的類使用??梢哉f前者屬于“靜態(tài)綁定”,而后者可以“動(dòng)態(tài)綁定”。
一個(gè)類實(shí)現(xiàn)了 Camparable 接口表明這個(gè)類的對(duì)象之間是可以相互比較的。如果用數(shù)學(xué)語言描述的話就是這個(gè)類的對(duì)象組成的集合中存在一個(gè)全序。這樣,這個(gè)類對(duì)象組成的集合就可以使用 Sort 方法排序了。
而 Comparator 的作用有兩個(gè):
1. 如果類的設(shè)計(jì)師沒有考慮到 Compare 的問題而沒有實(shí)現(xiàn) Comparable 接口,可以通過  Comparator 來實(shí)現(xiàn)比較算法進(jìn)行排序
2. 為了使用不同的排序標(biāo)準(zhǔn)做準(zhǔn)備,比如:升序、降序或其他什么序
例如: Person.java 、 TestComparable.java
(1) Person.java
public class Person implementsjava.lang.Comparable{
privatefinal int id;
privateString name;
privateint age;
publicPerson(int id,String name,int age){
this.id= id;
this.name= name;
this.age= age;
}
publicint getId(){
returnid;
}
publicvoid setName(String name){
this.name= name;
}
publicString getName(){
returnname;
}
publicvoid setAge(int age){
this.age= age;
}
publicint getAge(){
returnage;
}
publicString toString(){
return"Id: " + id + "/tName: " + name + "/tAge: " + age;
}
@Override
publicint compareTo(Objecto){      // 實(shí)現(xiàn) Comparable 接口的抽象方法,定義排序規(guī)則
Personp = (Person)o;
returnthis.id -p.id;                      // 升序排列,反之降序
}
@Override
publicboolean equals(Objecto){     //equals
booleanflag = false;
if(oinstanceof Person){
if(this.id== ((Person)o).id)
flag= true;
}
returnfalse;
}
}
(2)TestComparable.java
importjava.util.TreeSet;
importjava.util.Iterator;
public classTestComparable{
publicstatic void main(String[] args) {
TreeSetts = new TreeSet();
ts.add(newPerson(1003," 張三 ",15));
ts.add(newPerson(1008," 李四 ",25));
ts.add(newPerson(1015," 王五 ",73));
ts.add(newPerson(1001," 趙六 ",49));
Iteratorit = ts.iterator();
while(it.hasNext()){
Personemployee = (Person)it.next();
System.out.println(employee);
}
}
}
運(yùn)行結(jié)果:
Id:1001   Name: 趙六   Age: 49
Id:1003   Name: 張三   Age: 15
Id:1008   Name: 李四   Age: 25
Id:1015   Name: 王五   Age: 73
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java.lang.Comparable接口
java compare
使用TreeSet集合比較Comparable接口和Comparator接口的區(qū)別 - 低級(jí)寫手 android QQ群 13585749 - JavaEye技術(shù)網(wǎng)站
Java Set集合的詳解
TreeSet
Java深入了解TreeSet
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服