import java.util.*;
class Test_Set
{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int hashCode()
{
return id;
}
}
public class Student
{
public static void main(String[] args)
{
Set set=new HashSet();
Hash_Set hs=new Hash_Set();
Hash_Set hs2=new Hash_Set();
Hash_Set hs3=new Hash_Set();
Hash_Set hs4=new Hash_Set();
hs.setId(01);
hs.setName("li");
hs2.setId(02);
hs2.setName("wang");
hs3.setId(03);
hs3.setName("zhang");
hs4.setId(01);
hs4.setName("li");
set.add(hs);
set.add(hs2);//为什么执行到这一句发生了ClassCastException异常,为什么就只能添加一个元素啊?
set.add(hs3);
set.add(hs4);
Iterator it=set.iterator();
while(it.hasNext())
{
Object obj=it.next();
Hash_Set hs5=(Hash_Set)obj;
System.out.println(hs5.getId()+":"+hs5.getName());
}
}}
set.add(hs2);//为什么执行到这一句发生了ClassCastException异常,为什么就只能添加一个元素啊?
解决方案 »
- 自动【打地鼠】游戏的JAVA应用程序制作的思路(给路大神请帮忙)
- 小弟初学,关于J2SE 1.4前的用Object解决的泛型的一个问题,请教一下
- copy不同编码类型的txt文本
- 求较一个 移位运算符 的问题~~
- 有关swing的小问题
- 急问:java基础问题,关于访问字节数组时的类型转换问题。
- 使用过proxool的高手们请帮助小弟一下了
- 找不到class文件,希望高手帮帮偶!!急!!!!!
- !!!!!!!!!!!!关于在面板中拖动图片!!!!!!!!!!!!!!!1111
- 关于"另存为"的问题,请各位高手关心一下小弟,谢谢!
- 学习Java的好的书籍是什么,请教有经验的高手
- 关于JFrame窗口关闭的迷惑!
Set set=new HashSet();
改成
Set set=new TreeSet();的情况下发生的。
然后再添加就可以了.
所以自定义类必须要实现Comparable接口(不然怎么进行自动排序)
你说的这个是treeset内部实现的 不用我们自己在写了。。
楼主,你可以先将数据加在list里,然后把list放进set里就可以了哈。 给你写一个例子吧:import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;/**
* @功能:实现一个HashSet和TreeSet的例子
* @author JackRui
* @时间:2009.03.31
*/
public class SetDemo {
private static void printCol(Collection coll){
Iterator iter = coll.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("c");
coll.add("a");
coll.add("b");
coll.add("a");
Set set1 = new HashSet();
Set set2 = new TreeSet();
set1.addAll(coll);
set2.addAll(coll);
System.out.println("现在开始打印HashSet的内容: ");
printCol(set1);
System.out.println("现在开始打印TreeSet的内容: ");
printCol(set2);
}}
执行结果如下:
现在开始打印HashSet的内容:
a
c
b
现在开始打印TreeSet的内容:
a
b
c
你向集合里添加自定义对象试试看你的方法行不行得通???
String类型已经实现了compareTo方法的
import java.util.*;
public class Test_Set implements Comparable
{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int hashCode()
{
return id;
}
public boolean equals(Object obj)
{
if(obj==null)
{
return false;
}
if(obj instanceof Test_Set)
{
Test_Set hs=(Test_Set)obj;
if(id==hs.id)
{
if(this.name==hs.name)
return true;
}
}
return false;
}
public int compareTo(Object obj)
{
int result=0;
if(obj!=null && obj instanceof Test_Set)
{
Test_Set hs=(Test_Set)obj;
if(id>hs.id)
result=1;
else if(id<hs.id)
result=-1;
else
{
result=0;
}
}
return result;
}
}按照大家给的建议,我实现了Comparable接口,并重写了hashCode(),equals(),compareTo()这三个方法。运行正常了。
我想问一下,这三个方法的写法是不是按照我的这个写法就行了,不需要什么变更吗?实现Comparable接口,实现三个方法,是在什么情况下才要做的呢?现在是会写了,但理论方面还有点不明白。
1.Set集合中是不存在重复元素的,所以你要实现hashcode()与equals()方法,
判断时,首先判断对象间hashcode()返回值是否相等,若不相等,则对象不等。
若hashcode()相等,再进行equals()判断。
2.TreeSet是能够自动排序的,所以你要实现Comparable接口,重写compareTo()方法,根据compareTo()方法进行排序。
3.要判断对象是否相等时,重写hashcode()与equals();要进行排序时,重写compareTo()。
4.楼主可以结贴了,呵呵~~