map-Java TreeSet插入对象疑问

问题描述

Java TreeSet插入对象疑问

首先是Customer类定义:

package com.lzw;
import java.util.Comparator;
public class Customer implements Comparator<Object>{
private long id
private String name;
public Customer(String name,long id){
this.id=id;
this.name=name;
}
public int compare(Object o1,Object o2){
Customer c1=(Customer)o1;
Customer c2=(Customer)o2;
if(c1.getName().compareTo(c2.getName())>0) return -1;
if(c1.getName().compareTo(c2.getName())<0) return 1;
return 0;
}
public String getName(){
return name;
}
public long getId(){
return this.id;
}
}

然后是CustomerComparator类定义:

package com.lzw;
import com.lzw.Customer;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import java.util.Iterator;
public class CustomerComparator implements Comparator<Object>{
public int compare(Object o1,Object o2){
Customer c1=(Customer)o1;
Customer c2=(Customer)o2;
if(c1.getName().compareTo(c2.getName())>0) return -1;
if(c1.getName().compareTo(c2.getName()) return 0;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
TreeSet<Customer> set=new TreeSet<Customer>(new CustomerComparator());
Customer c1=new Customer("Andy",109201041);
Customer c2=new Customer("JACK",109207042);
Customer c3=new Customer("MIKE",109207043);
Customer c4=new Customer("Kath",109207044);
set.add(c1);
set.add(c2);
set.add(c3);
set.add(c4);
Iterator it=set.iterator();
while(it.hasNext()) {
Customer customer=(Customer)it.next();
System.out.println(customer.getName()+" "+customer.getId());
}
}
}

实例化对象:

  TreeSet<Customer> set=new TreeSet<Customer>(new CustomerComparator());

如果改成:

 TreeSet<customer> set=new TreeSet<customer>();

在 set.add(c1);语句时报错误:
Exception in thread "main" java.lang.ClassCastException: com.lzw.Customer cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1290)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at com.lzw.CustomerComparator.main(CustomerComparator.java:24)
问题:1、请问为什么会这样?2、TreeSet的集合元素是Customer对象,我也在Customer类实现了compare的方法,为什么在add的时候不是调用这个方法而是在CustomerComparator实现的compare的方法?

解决方案

treeset这个类,两种方式初始化,有指定比较器 和 没有指定比较器。
查看treeset这个类,父类是treemap,在执行add方法时,其实就是treemap的add。
源码要求,要么传一个comparator比较器给treeset;要么不传比较器时,要求元素类要实现comparable接口。
注:区分
Comparator 比较器的比较方法为 compare
Comparable 的比较方法为compareTo

解决方案二:

 public class Customer implements Comparator
 改成
 public class Customer implements Comparable

 如果treeset中通过构造初始化的,Comparator。
 如果构造函数没有初始化Comparator,那么add进入的对象必须实现Comparable才行,不然无法转化对象。

解决方案三:

都写着class cast exception了
java.lang.ClassCastException: com.lzw.Customer cannot be cast to java.lang.Comparable

強转出错,新手错误啊

时间: 2024-10-30 04:56:22

map-Java TreeSet插入对象疑问的相关文章

java反射-java 非空对象转map可行吗?

问题描述 java 非空对象转map可行吗? map objToMap(Object obj,Class clazz){ //返回一个 obj属性–obj属性对应值 的map } 或者 map objToMap(Object obj){ //返回一个 obj属性–obj属性对应值 的map } 不知道可不可以?有没有具体实现或者方法 解决方案 可以.参考http://blog.csdn.net/bober/article/details/5807440 解决方案二: http://www.cnb

解析Java程序中对象内存的分配和控制的基本方法_java

一.对象与内存控制的知识点 1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量). 2.继承关系中,当使用的对象引用变量编译时类型和运行时类型不同时,访问该对象的属性和方法是有区别的. 3.final修饰符特性. 二.java变量的划分与初始化过程 java程序的变量大体可以分为成员变量和局部变量,成员变量可以分为实例变量(非静态变量)和类变量(静态变量),一般我们遇到的局部变量会在下列几种情况中出现: (1)形参:在方法签名中定义的局部变量,由调用方为其赋值,随着方法结束消

java后台缓存对象的问题

问题描述 java后台缓存对象的问题 现在有这样一个场景,业务层调用远程webservice获取的结果传输到前台但只需要显示几个关键字段,待用户查询完毕后点击提交这些结果全部数据都要保存,在后台如何缓存这个查询结果?有用过在业务层增加一个属性来保存这个查询结果但是感觉不是太好,大家一般是怎么做的讨论一下,小弟在这里先谢谢啦. 解决方案 用Ehcache啊,查询完了放进Ehcache. 需要用了去Ehcache中去,类似于Map 解决方案二: 不需要缓存查询结果,只要有主键匹配上就可以了.

美国-JAVA课程编程作业疑问

问题描述 JAVA课程编程作业疑问 老师要求的用户界面显示结果如下: This program computes the total cost of a purchase. Enter the price of the purchased item. 12.50 Enter how many items are purchased? 3 The final cost of the purchase with the 7% tax applied is $40.125 以下是我的代码: packa

java反射原理制作对象打印工具_java

主要运用java反射原理,格式化输出java对象属性值,特别是list 和map.  MyTestUtil.java package utils; import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.Iterator; impor

java网络传递对象时该对象继承父类的属性在网络接收端接收该属性值总是null,why?

问题描述 java网络传递对象时该对象继承父类的属性在网络接收端接收该属性值总是null,why? //=========================== 情形一: ===============================//在网络上传递User1类对象时info属性值在网络的另一端能够接收到! public class User1 implements Serializable { public String info = null; public String userName =

转载:java的文件对象操作

对象                       java文 件对象操作 在 我 们 进 行 文 件 操 作 时, 需 要 知 道 一些关 于 文 件 的信 息.File类 提供了 一些 成 员 函 数 来 操 纵 文 件 和 获得 一些文 件 的 信 息. 1.创 建 一 个 新 的 文 件 对 象 你 可 用 下 面 三 个 方 法 来 创 建 一 个 新 文 件 对 象: File myFile; myFile = new File("etc/motd"); 或 myFile =

PPT怎么插入对象对齐

  PPT插入对象对齐第一招 利用"位置"属性首先在PPT软件中选中需要对齐的对象,然后点击鼠标右键,在弹出的快捷菜单中选择"设置对象格式"选项.此时该软件会弹出"设置形状格式"对话框,用鼠标单击该对话框左下角的"位置"标签,输入需要对齐对象的水平位置坐标值(如图1),然后单击"关闭"按钮,就可以让该对象的左侧对齐.同理,在"位置"标签输入垂直位置的坐标值,则可以让该对象的顶端对齐. 此

Java中的对象和对象引用实例浅析

  本文实例讲述了Java中的对象和对象引用.分享给大家供大家参考.具体分析如下: 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Jav