--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------
TreeSet本身对元素记性排序,要是自定的类,那么要是此类对象存数TreeSet中,那么就必须是S自定义的类本身具备比较性,那么据必须实现接口Comparable,并重写方法compareTo()方法,底层数据结构是二叉树
compareTo()返回值是整数,如果小于0,那么此对象就小于比较的对象,等于0,那么此对象就等于比较的对象,如果大于0,那么此对象就大于比较的对象。
有的对象在存储到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
从结果可以看出,如果名字相同,则比较年龄,如果年龄也相同,那么对象就相同了,此不存入此对象。
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
除了第一种比较方式,自然的排序,是对象本身具备比较性,还有另一种比较方式,那就是使集合具备比较性,那就是自定义比较器,把比较器通过构造方式传给集合,使集合剧本比较性。
步骤:定义一个类,实现接口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
从结果可以看出,先是按照名字排序,然后按照年龄排序。
自定义比较器,存储字符串,字符串按照长度大小排序
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