集合之Set【TreeSet】

package com.Lucky;

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

/**
 *    TreeSet:底层采用红黑树结构
 *           可排序【默认从小到大】/无重复/无索引
 *
 *
 *     注意点:1.在数据类型为数字型时,仍然按照从小到大排序
 *           2.在数据类型为char或String类型时,会根据ASCll编码的数字大小排序【跟字典的26个字母排序相同】
 *
 */
public class TreeSetDemo {

    public static void main(String[] args) {
         //创建TreeSet集合
        TreeSet<Integer> ts=new TreeSet<>();
            TreeSet<TestDemo> tsStudent=new TreeSet<>();

        //添加元素
        ts.add(1);
        ts.add(5);
        ts.add(9);
        ts.add(4);
        ts.add(2);

        //遍历输出
        Iterator<Integer> ite = ts.iterator();
         while (ite.hasNext()){
             System.out.print(ite.next()+"\t");  //自动从小到大进行排序
         }

        System.out.println();
         ts.forEach(str-> System.out.print(str+"\t"));

        System.out.println();
        System.out.println("--------------排序习题-----------------");
        //创建TestDemo对象
        TestDemo tr=new TestDemo("黎唯易",22);
        TestDemo tr4=new TestDemo("黎新丰",32);
        TestDemo tr3=new TestDemo("黎易",26);
        TestDemo tr2=new TestDemo("黎唯易",22);


        System.out.println(tsStudent.add(tr)); //报异常:ClassCastException
        System.out.println(tsStudent.add(tr4));//在自定义的数据类型中不知道比较规则
        System.out.println(tsStudent.add(tr3)); //解决方法1:用javabean类实现Comparable接口,重新comparaTo()方法
        System.out.println(tsStudent.add(tr2));

       //遍历数据
        for (TestDemo testDemo : tsStudent) {
            System.out.println(testDemo);
        }
    }
}

  TestDemo:

  
package com.Lucky;

import java.util.Objects;

public class TestDemo implements Comparable<TestDemo>{
    private String name;
    private int age;

    public TestDemo() {
    }

    public TestDemo(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 boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TestDemo testDemo = (TestDemo) o;
        return age == testDemo.age && Objects.equals(name, testDemo.name);
    }
//在这重写hashCode方法,
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

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

   // 重新compareTo按照年龄排序
    /*
     this:要添加的数据
     o   :已经在红黑树存在的数据


        return:  负数:在红黑树的左边
                 正数:在红黑树的右边
                 0:已经在红黑树存在,舍弃
     */
    @Override
    public int compareTo(TestDemo o) {
        return this.getAge()-o.getAge();
    }
}

  



练习:
package com.Lucky;

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

/*
    要求 :创建五个Student对象 ,有属性:姓名/年龄/语文/数学/英语
          先按照总分从高到低排序
          总分一样,就按照语文成绩排序
          如果语文成绩也一样,就按照数学成绩排序
          如果数学成绩也一样,就按照英语成绩排序
          如果英语成绩也一样,就按照年龄排序
          如果年龄也一样,就按照字母排序



 */
public class TreeSetDemoThree {
    public static void main(String[] args) {
        //创建集合
        //自定义比较器对象【如果自然排序和比较器同时存在,采用自定义比较器方法】
        TreeSet<Student> tree=new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int i=o1.getVerbal()+o1.getMath()+o1.getEnglish();
                int t=o2.getVerbal()+o2.getMath()+o2.getEnglish();
                int val=i-t;
                //比较语文成绩
                val= val==0 ?o1.getVerbal()-o2.getVerbal():val;
                //比较数学成绩
                val= val==0 ? o1.getMath()-o2.getMath():val;
                //比较英语成绩
                val= val==0 ? o1.getEnglish()-o2.getEnglish():val;
                //比较年龄
                val= val==0 ? o1.getAge()-o2.getAge():val;
                //比较字母排序
                val= val==0 ? o1.getName().compareTo(o2.getName()):val;
                return val;
            }
        });

        //创建Student对象
        Student stud1=new Student("唯易",22,98,95,85);
        Student stud2=new Student("新风",21,80,65,85);
        Student stud3=new Student("张三",23,70,88,77);
        Student stud4=new Student("李四",27,98,60,66);
        Student stud5=new Student("王五",23,98,95,85);

        //往集合添加数据
        tree.add(stud1);
        tree.add(stud2);
        tree.add(stud3);
        tree.add(stud4);
        tree.add(stud5);

        for (Student student : tree) {
          int sum=  student.getMath()+student.getEnglish()+student.getVerbal();
            System.out.println(student+"总分是:"+sum);
        }

    }
}

 


posted @ 2022-12-12 10:12  唯易人生  阅读(28)  评论(0)    收藏  举报