TreeSet集合,

来源:互联网 发布:赤壁网络花店 编辑:程序博客网 时间:2024/06/02 04:46

/*
 * TreeSet重点知识:
 *定理1:在Set集合中,HashSet是无序的,而TreeSet存储元素是有序的,按照元素的ascll码进行排序。

 *定理1.1:排序时,主要条件相同时,一定要判断次要条件。


 *  定理2:TreeSet的底层数据结构是二叉树。

 *   定理 2.1:TreeSet中延续Set集合不能存储相同元素,保证元素唯一性的依据,通过compareTo方法比较主要和次要条件。


 * 定理 3:TreeSet对元素存储时的两种排序方式。

 *  定理 3.1:

 *   排序的第一种方式:让元素自身具备比较性,实现comparable接口,覆盖compareTo方法。

 *      compareTo是按照字典顺序排序。

 *  定理3.2:

 *排序的第二种方式:元素不具备比较性,或者具备的比较性不是所需的。

 *   这时要让集合自身具备比较性。
 *   集合初始化时就有了比较方式,定义比较器,将比较器作为参数传递给TreeSet集合的构造函数。
 *   当两种排序都存在时,以比较器为主。
 *   定义一个比较器(类),实现Comparator接口,覆盖compare方法。
 *  

 */

 * 需求:
 * 往TreeSet集合中存储自定义对象学生。
 * 按照学生的年龄进行排序。

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetDemo {
public static void main(String[] args)
{
//存储字符串对象
/*
TreeSet ts=new TreeSet();
ts.add("abc");
ts.add("aaa");
ts.add("abb");
ts.add("acc");

*/


//存储自定义对象
TreeSet ts=new TreeSet(new MyCompare());
ts.add(new Student("lisi01",11));
ts.add(new Student("lisi02",14));
ts.add(new Student("lisi07",12));

ts.add(new Student("lisi07",13));


//定义ts的迭代器
Iterator it=ts.iterator();
while (it.hasNext())
{
//Object向下转型转成Studnet
Student s=(Student) it.next();
sop(s.getName()+"---"+s.getAge());

}


}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
//定义学生类,并且继承Comparable接口
class Student implements Comparable
{
//定义私有成员变量,并且用构造函数初始化
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
//复写compareTo方法
public int compareTo (Object obj)
{
//判断obj是不是属于Student类
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s=(Student)obj;
//System.out.println(this.name+"--compareTO--"+s.name);
//对岸年龄进行比较
if(this.age>s.age)
return 1;
//如果age相同,则比较name
if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}

}


//TreeDemo的第二种比较方式,定义比较器
class MyCompare implements Comparator
{
//实现Comparator接口,复写compare方法
public int compare(Object o1,Object o2){
//向下转型使用obj能调用Student的成员
Student s1=(Student)o1;
Student s2=(Student)o2;
//使用name进行比较
int num= s1.getName().compareTo(s2.getName());
//如果name相同则比较age
if(num==0)
{
return new Integer(s1.getAge()).compareTo(s2.getAge());
}
return num;
}

}


/*
 * 练习:按照字符串长度排序。
 * 字符串本身具备比较性,但是它的比较方式不是所需要的。
 * 定义比较器进行比较
 */
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo1 {
public static void main(String args[]) {
//定义TreeSet容器,在构造函数里传递比较器
TreeSet ts=new TreeSet(new MyCompare1());
//添加自定义元素
ts.add("ab");
ts.add("abb");
ts.add("aba");
ts.add("abde");
ts.add("aaaqq");
ts.add("aaapp");
ts.add("a");
//定义ts的比较器
Iterator it=ts.iterator();

while (it.hasNext())
{
//直接输出字符串对象,不用向下转型
sop(it.next());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
//定义一个构造器
class MyCompare1 implements Comparator{
public int compare(Object o1,Object o2)
{
//向下转型
String s1=(String) o1;
String s2=(String) o2;
//不安全的比较方式,不能保证比较器能正确的对容器里的元素进行排序。
/*if(s1.length()>s2.length())
return 1;
if(s1.length()==s2.length())
return 0;
return -1;*/

int num=new Integer(s1.length()).compareTo(s2.length());
//判断次要条件,当长度相同时,比较字符串的ascll码的大小。
if(num==0)
return s1.compareTo(s2);
return num;
}
}

0 0
原创粉丝点击