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()分割成整形,然后再排序