cannot be cast to java.lang.Comparable解决办法

cannot be cast to java.lang.Comparable,遇到这个异常错误,就是说treeMap(或者treeSet)并不知道该如何put,就会报这个异常错误。第一次put时,因为为空,所以不需要比较,即不会报错。但是当第二次put时,treeMap (或者treeSet) 为了确保他是有序的就必须比较,这个时候发现这两个key根本无法比较,则抛出该异常错误。
要解决这个异常错误有两种解决办法。第一种在构造TreeMap时指定一个比较器,这个比较器用于比较两个值,并且返回一个整数值作为他们的比较结果。第二种就是key实现Comparable接口。
 
             
publicMap> getTreeMap(){ 

      Map> map = new 
TreeMap>( 
                                                       
//比较器按照降序实现  
            (Comparator ) new Comparator(){ 
                                                                     
public int compare(Order order1, Order order2) { 
                                                                                    
return order2.getOrderId().compareTo(order1.getOrderId()); 
                                             } 
                                 } 
                             ); 
                             returnmap; 
             

其中的Order就是需要排序的类,里面的orderId就是需要排序的变量。
简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等 
注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算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);  

如果让我们实现这个程序的话  按我们的思路一定认为这样的输入应该是输入的重复值! 
但由于hashSet判断元素相等是按照默认的方法来的!! 
所以我们应该重写equals!并且hashcode也要一样!! 

另外 
1、Treeset中的数据是自动排好序的,不允许放入null值 

2、HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束 

 TreeSet类 
TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。 
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0 
也就是如果对对象进行排序储存的话从,必须对象类要实现equals\compareTo 
如果用compareTo则需要对象类实现Comparable!如果不实现的话! 
则 
                    
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. //执行到这里是爆出异常!!cannot be cast to java.lang.Comparable 因为Treeset的add方法对象时实现comparable接口的方法!他没有实现!在检查时报异常!!  
  9.         ts2.add(dh3);  


自然排序 
自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。 
obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是负数,则表明obj1小于obj2。 
如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0 
定制排序 
自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法

java.lang.Comparable 接口定义的 compareTo() 方法用于提供对其实现类的对象进行整体排序所需要的比较逻辑。

实现类基于 compareTo() 方法的排序被称为自然排序。而 compareTo() 方法的排序被称为它的自然排序。具体的排序原则可由实现类根据需要而定。用户在重写 compareTo() 方法以定制比较逻辑时,需要确保其余等价性判断方法 equals() 保持一致,即 e1.equals((Object)e2) e1.compareTo((Object)e2)==0 具有相同的值,这样的话我们就称自然顺序就和 equals 一致。

这个接口有什么用呢?

如果一个数组中的对象实现了 Compareable 接口,则对这个数组进行排序非常简单: Arrays.sort(); 如果 List 实现了该接口的话 , 我们就可以调用Collections.sort 或者 Arrays 方法给他们排序。实际上 Java 平台库中的所有值类 (value classes) 都实现了 Compareable 接口。

Comparable 接口只有一个方法 compareTo(Object obj)

其中

this < obj   返回负

this = obj   返回 0

this > obj   返回正

即将当前这个对象与指定的对象进行顺序比较,当该对象小于、等于或大于指定对象时,分别返回一个负整数、 0 或正整数,如果无法进行比较,则抛出ClassCastException 异常。

 

其实,有两种方式可以进行集合排序 

   1. 集合中对象的所属类实现了 java.lang.Comparable 接口

   2. 为集合指定比较器 java.lang.Comparator 的实现类

Comparator  Comparable 接口的区别是:

comparable 是通用的接口,用户可以实现它来完成自己特定的比较,而 comparator 可以看成一种算法的实现,在需要容器集合 collection 需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式,将算法和数据分离,就像 C++ STL 中的函数对象一样。

前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。

一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用 Sort 方法排序了。

 Comparator 的作用有两个:

   1. 如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过  Comparator 来实现比较算法进行排序

2. 为了使用不同的排序标准做准备,比如:升序、降序或其他什么序

 

 

例如: 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){      // 实现 Comparable 接口的抽象方法,定义排序规则

              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);     

              }

       }

}

运行结果:

Id: 1001   Name: 赵六   Age: 49

Id: 1003   Name: 张三   Age: 15

Id: 1008   Name: 李四   Age: 25

Id: 1015   Name: 王五   Age: 73



以上是网上对于java的解决方法


Android中其实一般来说只要在bean类的相应类中shixianjava.lang.Comparable就可以


  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值