Java集合(6)——TreeSet

TreeSet

如果元素具备自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。

public class Demo1 {

	public static void main(String[] args) {
		TreeSet tree1 = new TreeSet();
		tree1.add(1);
		tree1.add(10);
		tree1.add(7);
		tree1.add(19);
		tree1.add(9);
		System.out.println("tree1:"+tree1);
		
		TreeSet tree2 = new TreeSet();
		tree2.add('b');
		tree2.add('f');
		tree2.add('a');
		tree2.add('c');
		System.out.println("tree2:"+tree2);
	}

}

TreeSet的实现原理:

在这里插入图片描述

当三个结点不能形成分支的时候,应当调整,类似二叉平衡书,每个结点的左右分支之差不能大于1()见下图:
set.add(new Emp(110,“老陆”,100));
set.add(new Emp(113,“老汤”,300));
set.add(new Emp(128,“老蔡”,350));
set.add(new Emp(188,“老张”,400));

在这里插入图片描述
在这里插入图片描述

treeset添加自定义元素:
treeset要注意的事项:
1、往treeset添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
2、往treeset添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素
的比较规则定义在compareto(T o)方法中。
3、如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加(在TreeMap中如果重复,就只取代值)。(注意:TreeSet与HashCode、equals方法是没有任何关系的)
4、往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。

(1)实现Comparable接口:

package TreeSet;

import java.util.TreeSet;

/**
 *  treeset添加自定义元素:
 *
 *  treeset要注意的事项:
 *  	1、往treeset添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
 *  	2、网treeset添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素
 *  	的比较规则定义在compareto(T o)方法中。
 *  	3、如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加。(注意:TreeSet与HashCode、equals方法是没有任何关系的)
 *  	4、往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
 *  	5、往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,在创建TreeSet对象的时候也传入了比较器,那么是
 *  	以比较器的比较规则优先使用。
 *  	如何自定义定义比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在Compare方法内即可。
 *  		自定义比价器的格式:
 *  			class 类名 implements Comparator{
 *  				public int compare(Object o1,Object O2){
 *                                }*  			}
 *  			Comparator comparator = new Comparator();
 *  			TreeSet tree = new TreeSet(comparator);//带参的构造方法,传入比较器对象
 *  	推荐使用:比较器(Comparator):更好的提高代码复用性
 */
public class Demo2 {
    public static void main(String[] args){
        TreeSet set = new TreeSet();
        set.add(new Emp(113, "老钟", 200));
        set.add(new Emp(110, "老路", 100));
        set.add(new Emp(113, "老唐", 300));
        set.add(new Emp(113, "老菜", 500));
        set.add(new Emp(114, "老蔡", 500)); //添加失败
        set.add(new Emp(115, "老杨", 350));
        System.out.println("集合的元素(没有老蔡):"+set);
    }
}

class Emp implements Comparable{

    int id;

    String name;

    int salary;

    public Emp(int id, String name, int salary){
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public String toString(){
        return "{编号:" + this.id + " 姓名:" + this.name + " 薪水:" + this.salary + "}";
    }

    //负整数,零或正整数,根据此对象是小于,等于还是大于指定对象。
    public int compareTo(Object obj){
        Emp e = (Emp)obj;
        System.out.println(this.name+"compare"+e.name);
        return this.salary - e.salary; //升序
    }
}

(2)传入比较器

package TreeSet;

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

public class Demo3 {

    public static void main(String[] args){
        //创建一个比较器对象
        MyComparator comparator = new MyComparator();
        //创建TreeSet的时候传入比较器
        TreeSet set = new TreeSet(comparator);
        set.add(new Person(1, "小杨"));
        set.add(new Person(2, "小张"));
        set.add(new Person(1, "小李")); //添加失败
        set.add(new Person(6, "小孙"));

        System.out.println("集合的元素:"+set);
    }
}

class Person{

    int id;

    String name;

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

    public String toString(){
        return "{编号:" + this.id + " 姓名:" + this.name + "}";
    }

}

class MyComparator implements Comparator{
    //根据第一个参数小于,等于或者大于第二个参数分别返回负整数,零或正整数。
    public int compare(Object obj1, Object obj2){ //返回的如果是0,则视为重复元素,添加失败。
        Person p1 = (Person)obj1;
        Person p2 = (Person)obj2;
        return p1.id - p2.id;
    }
}

如何自定义定义比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在Compare方法内即可。
自定义比价器的格式:
class 类名 implements Comparator{
public int compare(Object o1,Object O2){
}
}
Comparator comparator = new Comparator();
TreeSet tree = new TreeSet(comparator);//带参的构造方法,传入比较器对象 推荐使用:比较器(Comparator)

TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口。 字符串的比较规则:
情况一:对应位置有不同的字符出现,比较的就是对应位置上的字符。
情况二:对应位置上的字符都一样,比较的就是字符串的长度。

public class Demo3 {

	public static void main(String[] args) {
		
		TreeSet tree = new TreeSet();
		tree.add("abccccccc");
		tree.add("abw");
		tree.add("ab");
		//可以添加成功, 因为字符串String类已经实现了Comparable这个接口
		System.out.println(tree);
		
	}

}
练习:

需求:将字符串中的数值进行排序
如:String str = “8 10 15 5 2 7”---->“2 5 7 8 10 15”

package TreeSet;

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

/**
 * 需求:将字符串中的数值进行排序
 * 	如:String str = "8 10 15 5 2 7"---->"2 5 7 8 10 15"
 */
public class Demo5 {
    public static void main(String[] args){
        String str = "8 10 15 5 2 7";
        String[] arr = str.split(" ");
        TreeSet<Integer> set = new TreeSet<Integer>();
        int len = arr.length;
        for(int i=0; i<len; i++){
            set.add(Integer.valueOf(arr[i])); //数字字符串转换为整数(用Integer.parseInt()也可以)
        }
        Iterator it = set.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+" ");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值