在TreeSet中实现存储自定义对象
2009-11-10 20:37
459 查看
在TreeSet中实现存储自定义对象
一、先来看一下TreeSet的继承结构和类声明形式
继承结构:
java.lang.Object
|_ java.util.AbstractCollection<E>
|_ java.util.AbstractSet<E>
|_ java.util.TreeSet<E>
类声明:
public class TreeSet<E>
extends AbstractSet<E>
implements SortedSet<E>, Cloneable, java.io.Serializable //它实现了sortedSet,有排序的功能
二、TreeSet的主要性质
1、TreeSet中不能有重复的元素;
2、TreeSet具有排序功能;
3、TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复、以及确定元素的顺序靠的都是这个方法;(这条性质比较重要,如果读者对TreeSet内部机制比较熟悉的话这条性质应该不难理解;如果读者不太理解的话可以参看以下这篇文章http://wlh269.javaeye.com/blog/376430)
4、对于java类库中定义的类,TreeSet可以直接对其进行存储,如String,Integer等(因为这些类已经实现了Comparable接口);
5、对于自定义类,如果不做适当的处理,TreeSet中只能存储一个该类型的对象实例,请看程序示例:
import java.util.*;
public class TreeSetDemo{
public static void main(String args[]){
TreeSet<Demo> tSet=new TreeSet<Demo>();
Demo d1=new Demo(1,"abc");
Demo d2=new Demo(2,"xyz");
tSet.add(d1);
tSet.add(d2);//如果有这条语句,运行程序时会抛出ClassCastException异常
//如果没有这条语句,程序会正常运行,并输出d1的内容
Iterator itr=tSet.iterator();
while(itr.hasNext()){
Demo d=(Demo)itr.next();
System.out.print(d.a+" "+d.b);
System.out.println();
}
}
}
class Demo{
int a;
String b;
public Demo(int a,String b){
this.a=a;
this.b=b;
}
}
三、在TreeSet中存储自定义类的实现方法
示例:
import java.util.*;
public class TreeSetDemo{
public static void main(String args[]){
TreeSet<Demo> tSet=new TreeSet<Demo>();
Demo d2=new Demo(2,"xyz");
Demo d3=new Demo(2,"uvw");
Demo d1=new Demo(1,"abc");
tSet.add(d1);
tSet.add(d2);
tSet.add(d3);
Iterator itr=tSet.iterator();
while(itr.hasNext()){
Demo d=(Demo)itr.next();
System.out.print(d.a+" "+d.b);//注意此程序运行时会输出几个元素
System.out.println();
}
}
}
class Demo implements Comparable{
int a;
String b;
public Demo(int a,String b){
this.a=a;
this.b=b;
}
public int compareTo(Object o){
Demo demo=(Demo)o;
if(this.a>demo.a){
return 1;
}else if(this.a<demo.a){
return -1;
}else{
return 0;
}
}
}
解析:上面程序会输出两个元素,并且是以a为判断标准按序输出的。当调用TreeSet的add()方法时,在TreeSet的内部会间接调用Demo的compareTo()方法、然后和TreeSet中已经存在的其他元素一一进行比较,在比较的过程中完成“判断是否重复”以及“排序”的功能:当在某次比较的过程中发现compareTo()返回0,就会认为待加入的元素已经存在于TreeSet中,返回-1或1的话就会根据TreeSet默认的比较器进行排序。
下面对程序进行修改,重写compareTo()方法,让TreeSet以a和b两个属性为依据来判断元素是否重复以及元素的顺序,请看下面的示例:
import java.util.*;
public class TreeSetDemo{
public static void main(String args[]){
TreeSet<Demo> tSet=new TreeSet<Demo>();
Demo d1=new Demo(1,"abc");
Demo d2=new Demo(2,"xyz");
Demo d3=new Demo(2,"uvw");
tSet.add(d1);
tSet.add(d2);
tSet.add(d3);
Iterator itr=tSet.iterator();
while(itr.hasNext()){
Demo d=(Demo)itr.next();
System.out.print(d.a+" "+d.b);//注意这次输出的元素个数
System.out.println();
}
}
}
class Demo implements Comparable{
int a;
String b;
public Demo(int a,String b){
this.a=a;
this.b=b;
}
public int compareTo(Object o){
Demo demo=(Demo)o;
if(this.a==demo.a&&this.b.equals(demo.b)){
return 0;
}else if(this.a>demo.a){
return 1;
}else {
return -1;
}
}
}
解析:这次改动了compareTo()方法,程序输出了三个元素d1,d2和d3;当我们自己定义类,并且需要将自定义的类存到TreeSet中的时候,需要认真考虑compareTo的定义方式即需要认真考虑实际应用中依据什么判断元素是否重复和元素的顺序。
一、先来看一下TreeSet的继承结构和类声明形式
继承结构:
java.lang.Object
|_ java.util.AbstractCollection<E>
|_ java.util.AbstractSet<E>
|_ java.util.TreeSet<E>
类声明:
public class TreeSet<E>
extends AbstractSet<E>
implements SortedSet<E>, Cloneable, java.io.Serializable //它实现了sortedSet,有排序的功能
二、TreeSet的主要性质
1、TreeSet中不能有重复的元素;
2、TreeSet具有排序功能;
3、TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复、以及确定元素的顺序靠的都是这个方法;(这条性质比较重要,如果读者对TreeSet内部机制比较熟悉的话这条性质应该不难理解;如果读者不太理解的话可以参看以下这篇文章http://wlh269.javaeye.com/blog/376430)
4、对于java类库中定义的类,TreeSet可以直接对其进行存储,如String,Integer等(因为这些类已经实现了Comparable接口);
5、对于自定义类,如果不做适当的处理,TreeSet中只能存储一个该类型的对象实例,请看程序示例:
import java.util.*;
public class TreeSetDemo{
public static void main(String args[]){
TreeSet<Demo> tSet=new TreeSet<Demo>();
Demo d1=new Demo(1,"abc");
Demo d2=new Demo(2,"xyz");
tSet.add(d1);
tSet.add(d2);//如果有这条语句,运行程序时会抛出ClassCastException异常
//如果没有这条语句,程序会正常运行,并输出d1的内容
Iterator itr=tSet.iterator();
while(itr.hasNext()){
Demo d=(Demo)itr.next();
System.out.print(d.a+" "+d.b);
System.out.println();
}
}
}
class Demo{
int a;
String b;
public Demo(int a,String b){
this.a=a;
this.b=b;
}
}
三、在TreeSet中存储自定义类的实现方法
示例:
import java.util.*;
public class TreeSetDemo{
public static void main(String args[]){
TreeSet<Demo> tSet=new TreeSet<Demo>();
Demo d2=new Demo(2,"xyz");
Demo d3=new Demo(2,"uvw");
Demo d1=new Demo(1,"abc");
tSet.add(d1);
tSet.add(d2);
tSet.add(d3);
Iterator itr=tSet.iterator();
while(itr.hasNext()){
Demo d=(Demo)itr.next();
System.out.print(d.a+" "+d.b);//注意此程序运行时会输出几个元素
System.out.println();
}
}
}
class Demo implements Comparable{
int a;
String b;
public Demo(int a,String b){
this.a=a;
this.b=b;
}
public int compareTo(Object o){
Demo demo=(Demo)o;
if(this.a>demo.a){
return 1;
}else if(this.a<demo.a){
return -1;
}else{
return 0;
}
}
}
解析:上面程序会输出两个元素,并且是以a为判断标准按序输出的。当调用TreeSet的add()方法时,在TreeSet的内部会间接调用Demo的compareTo()方法、然后和TreeSet中已经存在的其他元素一一进行比较,在比较的过程中完成“判断是否重复”以及“排序”的功能:当在某次比较的过程中发现compareTo()返回0,就会认为待加入的元素已经存在于TreeSet中,返回-1或1的话就会根据TreeSet默认的比较器进行排序。
下面对程序进行修改,重写compareTo()方法,让TreeSet以a和b两个属性为依据来判断元素是否重复以及元素的顺序,请看下面的示例:
import java.util.*;
public class TreeSetDemo{
public static void main(String args[]){
TreeSet<Demo> tSet=new TreeSet<Demo>();
Demo d1=new Demo(1,"abc");
Demo d2=new Demo(2,"xyz");
Demo d3=new Demo(2,"uvw");
tSet.add(d1);
tSet.add(d2);
tSet.add(d3);
Iterator itr=tSet.iterator();
while(itr.hasNext()){
Demo d=(Demo)itr.next();
System.out.print(d.a+" "+d.b);//注意这次输出的元素个数
System.out.println();
}
}
}
class Demo implements Comparable{
int a;
String b;
public Demo(int a,String b){
this.a=a;
this.b=b;
}
public int compareTo(Object o){
Demo demo=(Demo)o;
if(this.a==demo.a&&this.b.equals(demo.b)){
return 0;
}else if(this.a>demo.a){
return 1;
}else {
return -1;
}
}
}
解析:这次改动了compareTo()方法,程序输出了三个元素d1,d2和d3;当我们自己定义类,并且需要将自定义的类存到TreeSet中的时候,需要认真考虑compareTo的定义方式即需要认真考虑实际应用中依据什么判断元素是否重复和元素的顺序。
相关文章推荐
- 用TreeSet存储自定义对象1(实现Comparable接口)
- 在TreeSet中实现存储自定义对象,并且能够按照特定的顺序排序
- JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习
- JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习
- TreeSet集合存放自定义类型的对象,可以使用比较器,实现Comparable接口自己设置排序方式
- TreeSet存储自定义对象并保证排序和唯一
- 利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能
- TreeSet存储自定义对象
- Java 往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序。
- TreeSet存储自定义对象,并对对象排序的两种方式
- 集合框架---TreeSet存储自定义对象
- TreeSet排序,存储自定义对象,自定义比较器示例
- TreeSet存储自定义对象并遍历练习1(按照姓名排序)
- TreeSet存储自定义对象
- TreeSet存储自定义对象并遍历练习2(按照姓名的长度排序)
- 集合框架_HashSet存储自定义对象并遍历练习
- 利用DataGrid的自定义分页功能和存储过程结合实现高效分页
- iOS NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
- 对象继承时不能实现数据库的存储的解决方案
- iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档