一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

cannot be cast to java.lang.Comparable解決辦法

 昵稱(chēng)27831725 2016-03-08
 要解決這個(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) { 
                                                        
return order2.getOrderId().compareTo(order1.getOrderId()); 
                             
                     
                   ); 
                   returnmap; 
         

其中的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的值。 

看下面的例子! 

Java代碼  收藏代碼
  1.                 hashSetSorted hss3=new hashSetSorted(3,"a");  
  2. hashSetSorted hss4=new hashSetSorted(3,"a");  
  3. //System.out.println(hss3.equals(hss4));  
  4. //System.out.println(hss3.compareTo(hss4)==0);  
  5. HashSet hs=new HashSet();  
  6. hs.add(hss3);  
  7. hs.add(hss4);  
  8. System.out.println(hs);  

如果讓我們實(shí)現(xiàn)這個(gè)程序的話  按我們的思路一定認(rèn)為這樣的輸入應(yīng)該是輸入的重復(fù)值! 
但由于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ù)中唯一約束 

TreeSet類(lèi) 
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)的話! 
則 
                    
Java代碼  收藏代碼
  1. TreeSet ts2=new TreeSet();  
  2.         diyHashSet dh=new diyHashSet(1,"1");  
  3.         diyHashSet dh2=new diyHashSet(2,"1");  
  4.         diyHashSet dh3=new diyHashSet(3,"1");  
  5.       
  6.         ts2.add(dh);  
  7.         ts2.add(dh2);  
  8. //執(zhí)行到這里是爆出異常?。annot be cast to java.lang.Comparable 因?yàn)門(mén)reeset的add方法對(duì)象時(shí)實(shí)現(xiàn)comparable接口的方法!他沒(méi)有實(shí)現(xiàn)!在檢查時(shí)報(bào)異常?。?/span>  
  9.         ts2.add(dh3);  


自然排序 
自然排序使用要排序元素的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 接口定義的 compareTo() 方法用于提供對(duì)其實(shí)現(xiàn)類(lèi)的對(duì)象進(jìn)行整體排序所需要的比較邏輯。

實(shí)現(xiàn)類(lèi)基于 compareTo() 方法的排序被稱(chēng)為自然排序。而 compareTo() 方法的排序被稱(chēng)為它的自然排序。具體的排序原則可由實(shí)現(xiàn)類(lèi)根據(jù)需要而定。用戶(hù)在重寫(xiě) compareTo() 方法以定制比較邏輯時(shí),需要確保其余等價(jià)性判斷方法 equals() 保持一致,即 e1.equals((Object)e2) e1.compareTo((Object)e2)==0 具有相同的值,這樣的話我們就稱(chēng)自然順序就和 equals 一致。

這個(gè)接口有什么用呢?

如果一個(gè)數(shù)組中的對(duì)象實(shí)現(xiàn)了 Compareable 接口,則對(duì)這個(gè)數(shù)組進(jìn)行排序非常簡(jiǎn)單: Arrays.sort(); 如果 List 實(shí)現(xiàn)了該接口的話 我們就可以調(diào)用Collections.sort 或者 Arrays 方法給他們排序。實(shí)際上 Java 平臺(tái)庫(kù)中的所有值類(lèi) (value classes) 都實(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ù)、 或正整數(shù),如果無(wú)法進(jìn)行比較,則拋出ClassCastException 異常。

 

其實(shí),有兩種方式可以進(jìn)行集合排序 

   1. 集合中對(duì)象的所屬類(lèi)實(shí)現(xiàn)了 java.lang.Comparable 接口

   2. 為集合指定比較器 java.lang.Comparator 的實(shí)現(xiàn)類(lèi)

Comparator , Comparable 接口的區(qū)別是:

comparable 是通用的接口,用戶(hù)可以實(shí)現(xiàn)它來(lái)完成自己特定的比較,而 comparator 可以看成一種算法的實(shí)現(xiàn),在需要容器集合 collection 需要比較功能的時(shí)候,來(lái)指定這個(gè)比較器,這可以看出一種設(shè)計(jì)模式,將算法和數(shù)據(jù)分離,就像 C++ STL 中的函數(shù)對(duì)象一樣。

前者應(yīng)該比較固定,和一個(gè)具體類(lèi)相綁定,而后者比較靈活,它可以被用于各個(gè)需要比較功能的類(lèi)使用??梢哉f(shuō)前者屬于“靜態(tài)綁定”,而后者可以“動(dòng)態(tài)綁定”。

一個(gè)類(lèi)實(shí)現(xiàn)了 Camparable 接口表明這個(gè)類(lèi)的對(duì)象之間是可以相互比較的。如果用數(shù)學(xué)語(yǔ)言描述的話就是這個(gè)類(lèi)的對(duì)象組成的集合中存在一個(gè)全序。這樣,這個(gè)類(lèi)對(duì)象組成的集合就可以使用 Sort 方法排序了。

 Comparator 的作用有兩個(gè):

   1. 如果類(lèi)的設(shè)計(jì)師沒(méi)有考慮到 Compare 的問(wèn)題而沒(méi)有實(shí)現(xiàn) Comparable 接口,可以通過(guò)  Comparator 來(lái)實(shí)現(xiàn)比較算法進(jìn)行排序

2. 為了使用不同的排序標(biāo)準(zhǔn)做準(zhǔn)備,比如:升序、降序或其他什么序

 

 

例如: Person.java  TestComparable.java

(1) Person.java

public class Person implements java.lang.Comparable{

       private final int id;

       private String name;

       private int age;

      

       public Person(int id,String name,int age){

              this.id = id;

              this.name = name;

              this.age = age;

       }

       public int getId(){

              return id;

       }

       public void setName(String name){

              this.name = name;

       }

       public String getName(){

              return name;  

       }

       public void setAge(int age){

              this.age = age;

       }

       public int getAge(){

              return age;     

       }

       public String toString(){

              return "Id: " + id + "/tName: " + name + "/tAge: " + age;

          

       @Override

       public int compareTo(Object o){      // 實(shí)現(xiàn) Comparable 接口的抽象方法,定義排序規(guī)則

              Person p = (Person)o;

              return this.id - p.id;                      // 升序排列,反之降序

       }

       @Override

       public boolean equals(Object o){     //equals

              boolean flag = false;

              if(o instanceof Person){

                     if(this.id == ((Person)o).id)

                            flag = true;

              }

              return false;          

          

}

(2) TestComparable.java

import java.util.TreeSet;

import java.util.Iterator;

 

public class TestComparable{

       public static void main(String[] args) {

              TreeSet ts = new TreeSet();

              ts.add(new Person(1003," 張三 ",15));

              ts.add(new Person(1008," 李四 ",25));

              ts.add(new Person(1015," 王五 ",73));

              ts.add(new Person(1001," 趙六 ",49));

 

              Iterator it = ts.iterator();

              while(it.hasNext()){

                     Person employee = (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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    日韩中文字幕视频在线高清版| 加勒比日本欧美在线观看| 神马午夜福利一区二区| 免费在线观看激情小视频| 国产精品一区二区三区日韩av| 欧美乱妇日本乱码特黄大片| 国产情侣激情在线对白| 99久久精品免费看国产高清| 午夜福利精品视频视频| 国产成人精品国内自产拍| 欧美小黄片在线一级观看| 成人精品欧美一级乱黄| 国产精品一区二区香蕉视频| 精品人妻少妇二区三区| 美女黄色三级深夜福利| 亚洲精品一区三区三区| 国产精品大秀视频日韩精品| 欧美国产精品区一区二区三区| 九九九热在线免费视频| 97人妻精品一区二区三区男同| 亚洲午夜精品视频在线| 国产精欧美一区二区三区久久| 少妇人妻精品一区二区三区| 草草视频精品在线观看| 亚洲av首页免费在线观看| 免费在线观看欧美喷水黄片| 欧美日韩精品人妻二区三区| 99久久精品一区二区国产| 国产欧美日韩一级小黄片| 精品欧美日韩一区二区三区| 日韩高清中文字幕亚洲| 国产黄色高清内射熟女视频| 国产成人精品一区二区在线看| 日本午夜乱色视频在线观看| 日本在线不卡高清欧美| 开心五月激情综合婷婷色| 亚洲免费观看一区二区三区| 日韩一级一片内射视频4k| 国产丝袜极品黑色高跟鞋| 日本欧美三级中文字幕| 国产在线日韩精品欧美|