Set接口之TreeSet

*TreeSet*

这里需要特别说明一下TreeSet集合是无序的,即向集合中添加元素的顺序和取出元素的顺序是不一致的,但是底层基于红黑树实现,会根据元素本身进行排序,比方说你放进去的是2 1 3,取出来的是1 2 3,也就是说默认是升序排列。

简单小案例

package com.genericlist;

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

/**
 * TreeSet的简单使用
 *
 */
public class TreeSetDemo01 {
    public static void main(String[] args) {
        TreeSet<String> treeSet = new TreeSet();
        //1.添加数据
        treeSet.add("apple");
        treeSet.add("bananer");
        treeSet.add("Durian");//表示榴莲
        treeSet.add("apple");//不能添加重复的元素
        System.out.println("集合大小===="+treeSet.size());
        System.out.println("集合遍历===="+treeSet);//默认重写的toString方法

        //2.删除
//        treeSet.remove("apple");
//        System.out.println("删除之后集合大小===="+treeSet.size());
//        System.out.println("删除之后集合遍历===="+treeSet);//默认重写的toString方法
        System.out.println("=========3.1使用增强for==========");
        for (Object o : treeSet) {
            String col1=(String) o;
            System.out.println(col1);
        }
        //迭代器是专门用来遍历集合的一种方式
        System.out.println("=========3.2使用iterator迭代器==========");
        Iterator<String> iterator = treeSet.iterator();
        while (iterator.hasNext()){
            String col2 = (String)iterator.next();
            System.out.println(col2);
        }
        //4.判断
        System.out.println(treeSet.contains("bananer"));

    }
}

运行结果:
集合大小====3
集合遍历====[Durian, apple, bananer]
=========3.1使用增强for==========
Durian
apple
bananer
=========3.2使用iterator迭代器==========
Durian
apple
bananer
True

*小练习-对随机字符串进行排序展示*

package com.genericlist;

import sun.applet.Main;

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

/**
 * 小案例:对给定的随机字符串进行排序,长度优先,然后在根据每个字符在字典表中的顺序进行排序
 */
public class TreeSetMiniCase {
    public static void main(String[] args) {
        TreeSet<String> treeSet=new TreeSet<String>(new Comparator<String>() {
            public int compare(String o1, String o2) {
                int n1 = o1.length() - o2.length();
                int n2 = o1.compareTo(o2);
                return n1==0?n2:n1;
            }
        });
        //添加数据
        treeSet.add("tqMGrtBlIL");
        treeSet.add("fqTyNegIeU");
        treeSet.add("aiuyaoLPli");
        treeSet.add("YJZzlycwDb");
        treeSet.add("xVwIUEBKPF");
        treeSet.add("WtNbpfHppL");
        treeSet.add("ZLKTjRrPYT");
        System.out.println("元素的个数:"+treeSet.size());
        System.out.println("元素内容:"+treeSet);
    }


}

运行结果
元素的个数:7
元素内容:[WtNbpfHppL, YJZzlycwDb, ZLKTjRrPYT, aiuyaoLPli, fqTyNegIeU, tqMGrtBlIL, xVwIUEBKPF]

*小练习-Comparator实现可定制化比较*

package com.genericlist;

import sun.reflect.generics.tree.Tree;

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

/**
 * TreeSet集合的使用
 * Comparator:实现定制比较(比较器)
 * Comparable:可比较
 *
 */
public class TreeSetComparator {
    public static void main(String[] args) {
        //创建集合
        TreeSet<Person> personTreeSet=new TreeSet<Person>(new Comparator<Person>(){
            public int compare(Person o1, Person o2) {
                //先比较年龄,再比较姓名
                int n1 = o1.getAge() - o2.getAge();
                int n2 = o1.getName().compareTo(o2.getName());
                return n1==0?n2:n1;
            }
        });

        Person person01 = new Person("张三", 20);
        Person person02 = new Person("李四",21);
        Person person03 = new Person("王五",22);
        personTreeSet.add(person01);
        personTreeSet.add(person02);
        personTreeSet.add(person03);
        personTreeSet.add(person03);//重复的元素是不能添加的
        System.out.println("集合大小===="+personTreeSet.size());
        System.out.println("集合遍历===="+personTreeSet);//默认重写的toString方法
    }
}

运行结果:

集合大小====3
集合遍历====[Person{name='张三', age=20}, Person{name='李四', age=21}, Person{name='王五', age=22}]

*TreeSet排序-实体类要实现Comparable接口**

package com.genericlist;

import com.sun.org.apache.xpath.internal.operations.Equals;


/**
 * 人类
 */
public class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    /**
     * 解释:为什么使用31
     * 1.31是一个指数,减少散列冲突 2.31能够提高执行效率 31 * i = (i << 5) - i(左边  31*2=62,右边   2*2^5-2=62) - 两边相等
     *
     * @return
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    //重写hashcode方法进行内存地址的判断
//    @Override
//    public int hashCode() {
//        int n1 = this.name.hashCode();
//        int n2 = this.age;
//        return n1 + n2;
//    }

    //必须重写equals方法才能判断添加的对象是否重复
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (obj instanceof Person) {
            Person person = (Person) obj;
            if (this.name.equals(person.getName()) && this.age == person.getAge()) {
                return true;
            }
        }
        return false;
    }

    /**
     * 先按照姓名比较,再按照年龄进行比较,如果姓名相同,则返回年龄
     *
     * @param o
     * @return
     */
    public int compareTo(Person o) {
        int n1 = this.getName().compareTo(o.getName());
        int n2 = this.age - o.getAge();
        return n1 == 0 ? n2 : n1;

    }
}

创建测试类

package com.genericlist;

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

/**
 * 使用TreeSet保存数据
 * 存储结构:红黑树 左边的节点都要比右边的节点要小
 * compareTo方法的返回值为0,则认为是重复元素则不能添加进来了
 */
public class TreeSetSort {
    public static void main(String[] args) {
        TreeSet<Person> personTreeSet = new TreeSet<Person>();
        Person person01 = new Person("张三", 20);
        Person person02 = new Person("李四",21);
        Person person03 = new Person("王五",22);
        personTreeSet.add(person01);
        personTreeSet.add(person02);
        personTreeSet.add(person03);

        System.out.println("集合大小===="+personTreeSet.size());
        System.out.println("集合遍历===="+personTreeSet);
        //以上的遍历方式报错了 java.lang.ClassCastException: com.genericlist.Person cannot be cast to java.lang.Comparable
        //实现了comparable接口之后,再次运行,发现就不报错了。
        //2.删除
//        personTreeSet.remove(person01);
//        System.out.println("删除之后集合大小===="+personTreeSet.size());
//        System.out.println("删除之后集合遍历===="+personTreeSet);
        System.out.println("=========3.1使用增强for==========");
        for (Object o : personTreeSet) {
            Person col1=(Person) o;
            System.out.println(col1);
        }
        //迭代器是专门用来遍历集合的一种方式
        System.out.println("=========3.2使用iterator迭代器==========");
        Iterator<Person> iterator = personTreeSet.iterator();
        while (iterator.hasNext()){
            Person col2 = (Person)iterator.next();
            System.out.println(col2);
        }
        //4.判断
        System.out.println(personTreeSet.contains(new Person("张三", 20)));


    }
}

*运行结果*

集合大小====3
集合遍历====[Person{name='张三', age=20}, Person{name='李四', age=21}, Person{name='王五', age=22}]
=========3.1使用增强for==========
Person{name='张三', age=20}
Person{name='李四', age=21}
Person{name='王五', age=22}
=========3.2使用iterator迭代器==========
Person{name='张三', age=20}
Person{name='李四', age=21}
Person{name='王五', age=22}
true

posted on 2021-01-30 17:38  ~码铃薯~  阅读(132)  评论(0编辑  收藏  举报

导航