乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       昵稱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就是需要排序的類,里面的orderId就是需要排序的變量。
      簡(jiǎn)單的說,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代碼  收藏代碼
      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)的方法來的!! 
      所以我們應(yīng)該重寫equals!并且hashcode也要一樣!! 

      另外 
      1、Treeset中的數(shù)據(jù)是自動(dòng)排好序的,不允許放入null值 

      2、HashSet中的數(shù)據(jù)是無序的,可以放入null,但只能放入一個(gè)null,兩者中的值都不能重復(fù),就如數(shù)據(jù)庫中唯一約束 

      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代碼  收藏代碼
      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í)行到這里是爆出異常!!cannot be cast to java.lang.Comparable 因?yàn)門reeset的add方法對(duì)象時(shí)實(shí)現(xiàn)comparable接口的方法!他沒有實(shí)現(xiàn)!在檢查時(shí)報(bào)異常?。?/span>  
      9.         ts2.add(dh3);  


      自然排序 
      自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關(guān)系,然后將元素按照升序排列。
      Java提供了一個(gè)Comparable接口,該接口里定義了一個(gè)compareTo(Object obj)方法,該方法返回一個(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,T o2)方法

      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)行排序非常簡(jiǎn)單: Arrays.sort(); 如果 List 實(shí)現(xiàn)了該接口的話 我們就可以調(diào)用Collections.sort 或者 Arrays 方法給他們排序。實(shí)際上 Java 平臺(tá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ù),如果無法進(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 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)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(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)遵守用戶 評(píng)論公約

        類似文章 更多