您的位置:首页 > 职场人生

黑马程序员_<<Set,TreeSet>>

2013-09-23 20:27 483 查看
--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------

1.TreeSet

1. 概述

TreeSet本身对元素记性排序,要是自定的类,那么要是此类对象存数TreeSet中,那么就必须是S自定义的类本身具备比较性,那么据必须实现接口Comparable,并重写方法compareTo()方法,底层数据结构是二叉树

compareTo()返回值是整数,如果小于0,那么此对象就小于比较的对象,等于0,那么此对象就等于比较的对象,如果大于0,那么此对象就大于比较的对象。

2. 自然排序规则(Comparable)

有的对象在存储到TreeSet本身就具备可比性,例如:String类,是要找ASCII大小比较的,那么我们就以自定义的类来存储TreeSet中,使其具备可比性。

package www.fuxi.jihe;
//自定义的异常
public class RunntimeNoStudentExceptionextends RuntimeException {
publicRunntimeNoStudentException(String message){
super(message);
}
}

package www.fuxi.jihe;

public class Student implements Comparable {
private String name;// 姓名
private int age;// 年龄

public Student(Stringname, int age) {
super();
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

public int compareTo(Object o) {
if(!(o instanceof Student))
throw new RunntimeNoStudentException("不是Student对象");
Student stu=(Student)o;
if(this.name.equals(stu.name)){
return this.age-stu.age;
}
return this.name.compareTo(stu.name);
}

}
package www.fuxi.jihe;

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

public class TreeSetDemo {
public static void main(String[]args) {
TreeSet set=new TreeSet();
set.add(new Student("zhangsan",22));
set.add(new Student("zhangsan",23));
set.add(new Student("zhangsan",22));
set.add(new Student("lisi",25));
Iterator it=set.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.getName()+":"+stu.getAge());
}
}

}

结果:
lisi:25
zhangsan:22
zhangsan:23


从结果可以看出,如果名字相同,则比较年龄,如果年龄也相同,那么对象就相同了,此不存入此对象。

3. 模拟二叉树



package www.fuxi.jihe;

class ErChaShu {
class Node {
private Comparable data;
private Node left;
private Node right;

public Node(Comparable data) {// 构造方法初始化数据
this.data = data;
}

public void addNode(Node newNode) {
if (newNode.data.compareTo(this.data) < 0) {// 利用compareTo方法比较
if (this.left == null) {// 判断是否放在左子树
this.left = newNode;
} else {
this.left.addNode(newNode);
}
}
if (newNode.data.compareTo(this.data) >= 0) {// 判断是否放在右子树
if (this.right == null) {
this.right = newNode;
} else {
this.right.addNode(newNode);
}
}

}

public void printNode() {// 输出元素,中序遍历
if (this.left != null) {
this.left.printNode();// 输出左子树
}
System.out.print(this.data + "\t");
if (this.right != null) {
this.right.printNode();
}
}
}

private Node root = null;// 存放根节点

public void add(Comparable com) {// 加入新元素
Node newNode = new Node(com);// 定义新结点
if (this.root == null) {
this.root = newNode;
} else {
this.root.addNode(newNode);// 判断是放在左子树还是右子树
}
}

public void print() {// 输出新结点
this.root.printNode();
}
}

public class TextClass {
public static void main(String[] agrs) throws Exception {
ErChaShu t = new ErChaShu();
t.add(4);// 添加元素
t.add(2);
t.add(0);
t.add(7);
t.add(9);
t.add(8);
t.print();// 输出元素
}
}

结果:
0  2  4  7  8  9


4. 自定义比较器(Comparator)

除了第一种比较方式,自然的排序,是对象本身具备比较性,还有另一种比较方式,那就是使集合具备比较性,那就是自定义比较器,把比较器通过构造方式传给集合,使集合剧本比较性。

步骤:定义一个类,实现接口Comparator,然后重写方法compare方法。

当比较器和自定义的自然排序同时存在的时候,那么就一比较器为主。

public class RunntimeNoStudentException extends RuntimeException {
publicRunntimeNoStudentException(String message){
super(message);
}
}
public class Person {
private String name;// 姓名
private int age;// 年龄

public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

}
import java.util.Comparator;

public class MyCompartor implements Comparator {

public int compare(Object o1, Object o2) {//从写此方法
if(!(o1 instanceof Person || o2 instanceof Person)){
throw newRunntimeNoStudentException("不是Person对象");
}
Person p=(Person)o1;
Person p1=(Person)o2;
int num=p.getName().compareTo(p1.getName());
if(num==0)
return p.getAge()-p1.getAge();
return num;
}

}
package www.fuxi.jihe;

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

public class TreeSetDemo {
publicstatic void main(String[] args) {

TreeSetset = new TreeSet(new MyCompartor());
set.add(newPerson("java03", 22));
set.add(newPerson("java01", 23));
set.add(newPerson("net07", 22));
set.add(newPerson("net03", 25));
Iteratorit = set.iterator();
while(it.hasNext()) {
Personstu = (Person) it.next();
System.out.println(stu.getName()+ ":" + stu.getAge());
}
}

}
结果:
java01:23
java03:22
net03:25
net07:22


从结果可以看出,先是按照名字排序,然后按照年龄排序。

5. 练习

自定义比较器,存储字符串,字符串按照长度大小排序

import java.util.Comparator;

public class MyStringCompartor implements Comparator {

public int compare(Object o1, Object o2) {//从写此方法
if(!(o1 instanceof String|| o2 instanceof String)){
throw newRunntimeNoStudentException("不是String的子类或者Person对象");
}
Strings1=(String)o1;
Strings2=(String)o2;
return s1.length()-s2.length();
}

}
importjava.util.Iterator;
importjava.util.TreeSet;

publicclass TreeSetDemo {
public static void main(String[] args) {

TreeSet set = new TreeSet(new MyStringCompartor());
set.add("abcd");
set.add("ad");
set.add("cdf");
set.add("a");
set.add("abcdfrr");
Iterator it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}

}
结果:
a
ad
cdf
abcd
abcdfrr


--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流!
--------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: