1、TreeSet()是使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。
2、Integer和String对象都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自己定义的类必须实现Comparable接口,并且覆写相应的compareTo()函数,才可以正常使用。
3、在覆写compare()函数时,要返回相应的值才能使TreeSet按照一定的规则来排序(升序,this.对象 < 指定对象的条件下返回-1)
(降序,this.对象 < 指定对象的条件下返回-1)升序是:比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
实例一:先比较年龄,年龄相同再比较姓名
package Compare; import java.util.Iterator; import java.util.TreeSet; public class TreeSetTest { public static void main(String args[]){ Persontest per1 = new Persontest("zhangsan", 33); Persontest per2 = new Persontest("lisi", 33); Persontest per3 = new Persontest("wangwu", 22); Persontest per4 = new Persontest("zhaoliu", 44); TreeSet treeSet=new TreeSet(); treeSet.add(per1); treeSet.add(per2); treeSet.add(per3); treeSet.add(per4); Iterator iterator=treeSet.iterator(); while(iterator.hasNext()){ Persontest t=(Persontest) iterator.next(); System.out.println(t.getName()+"的年纪是"+t.getAge()); } } } class Persontest implements Comparable{ private String name; private int age; public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } public Persontest(String name, int age){ this.name = name; this.age = age; } public int compareTo(Object obj){ Persontest per = (Persontest) obj; if(per.age < this.age){ return -1; } if(per.age > this.age){ return 1; } if(per.age == this.age){ return this.name.compareTo(per.name); } return 0; } }
package Compare; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; // 需要在类中新建一个自己的比较器 public class TreeSetTest2 { public static void main(String args[]){ TreeSet ts = new TreeSet(new Human.Comp()); ts.add(new Human("zhangsan", 33)); ts.add(new Human("lii", 44)); ts.add(new Human("wangwu", 33)); ts.add(new Human("zhuliu", 55)); Iterator it = ts.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } } class Human{ private String name; private int age; public Human(String name, int age){ this.name = name; this.age = age; } public String toString(){ return "姓名:"+name+" 年龄:"+age; } static class Comp implements Comparator{ public int compare(Object ob1, Object ob2){ Human h1 = (Human)ob1; Human h2 = (Human)ob2; int result = h1.age > h2.age ? 1 :(h1.age == h2.age ? 0 : -1); if(result == 0){ result = h1.name.compareTo(h2.name); } return result; } }
package Sort; import java.util.Iterator; import java.util.TreeSet; //将字符串中的 整形数字排序 //如"23,32,22,1,-2,33"排序后输出 public class SortInt1 { public static void main(String args[]){ SortInt1 sortTest = new SortInt1(); String str = "33, 34, 77, 4, 56";// 在这里坑了宝宝半天啊,我习惯性的在逗号后边加了空格,结果就是一直报错 sortTest.SortTest(str); } public void SortTest(String str){ String strary[] = str.split(", "); // 这里也必须加空格才可以 TreeSet tre = new TreeSet(); for(int i = 0; i < strary.length; i++){ tre.add(Integer.parseInt(strary[i])); } // 再将整形数组转化成字符串输出 Iterator integer = tre.iterator(); StringBuffer strbuf = new StringBuffer(); while(integer.hasNext()){ strbuf.append(integer.next()+", "); } strbuf.deleteCharAt(strbuf.length() - 1); System.out.println("排序后的整形数组是:"+strbuf.toString()); } }
package Sort; import java.util.Arrays; /* * 排序方式二 * 一、将字符串使用split()编程整形数组 * 二、使用Integer.parseInt()将字符串数组变成整形数组 * 三、使用Arrays.sort()对整形数组进行排序 * 四、将排序的好整形数组使用StringBuffer变成整形 * */ public class SortInt2 { public static void main(String args[]){ String str = "33, 34, 77, 4, 56"; SortInt2 sortTest = new SortInt2(); sortTest.SortTest(str); } public void SortTest(String str){ String strary[] = str.split(", "); //一、将字符串使用split()编程整形数组 int intary[] = new int [strary.length]; for(int i = 0; i < strary.length; i++){ intary[i] = Integer.parseInt(strary[i]);//二、使用Integer.parseInt()将字符串数组变成整形数组 } Arrays.sort(intary);//第三、整形数组排序 StringBuffer strbuf = new StringBuffer(); for(int j = 0; j < intary.length; j++){ strbuf.append(intary[j]+", "); } strbuf.delete(strbuf.length() - 2, strbuf.length() - 1); System.out.println(strbuf.toString()); } }前两个是TreeSet()的讲解,后两个是字符串通过split()分割成整形,然后再排序