天天看點

Java知識【Set集合&TreeSet集合】

目錄

​​1,Set集合​​

​​1.1:Set集合概述和特點【應用】​​

​​1.2:Set集合的使用【應用】​​

​​2,TreeSet集合​​

​​2.1:TreeSet集合概述和特點【應用】​​

​​2.2:TreeSet集合基本使用【應用】​​

​​2.3:自然排序Comparable的使用【應用】​​

​​2.4:比較器排序Comparator的使用【應用】​​

​​2.5:兩種比較方式總結【了解】​​

1,Set集合

1.1:Set集合概述和特點【應用】

  • 不可以存儲重複元素
  • 沒有索引,不能使用普通for循環周遊

1.2:Set集合的使用【應用】

存儲字元串并周遊

public class MySet1 {
    public static void main(String[] args) {
        //建立集合對象
        Set<String> set = new TreeSet<>();
        //添加元素
        set.add("ccc");
        set.add("aaa");
        set.add("aaa");
        set.add("bbb");

//        for (int i = 0; i < set.size(); i++) {
//            //Set集合是沒有索引的,是以不能使用通過索引擷取元素的方法
//        }
      
        //周遊集合
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
        System.out.println("-----------------------------------");
        for (String s : set) {
            System.out.println(s);
        }
    }
}      

2,TreeSet集合

2.1:TreeSet集合概述和特點【應用】

  • 不可以存儲重複元素
  • 沒有索引
  • 可以将元素按照規則進行排序
  • TreeSet():根據其元素的自然排序進行排序
  • TreeSet(Comparator comparator) :根據指定的比較器進行排序

2.2:TreeSet集合基本使用【應用】

public class TreeSetDemo01 {
    public static void main(String[] args) {
        //建立集合對象
        TreeSet<Integer> ts = new TreeSet<Integer>();

        //添加元素
        ts.add(10);
        ts.add(40);
        ts.add(30);
        ts.add(50);
        ts.add(20);

        ts.add(30);

        //周遊集合
        for(Integer i : ts) {
            System.out.println(i);
        }
    }
}      

2.3:自然排序Comparable的使用【應用】

  • 案例需求
  • 存儲學生對象并周遊,建立TreeSet集合使用無參構造方法
  • 要求:按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序
  • 實作步驟
  1. 使用空參構造建立TreeSet集合
  • 用TreeSet集合存儲自定義對象,無參構造方法使用的是自然排序對元素進行排序的
  1. 自定義的Student類實作Comparable接口
  • 自然排序,就是讓元素所屬的類實作Comparable接口,重寫compareTo(T o)方法
  1. 重寫接口中的compareTo方法
  • 重寫方法時,一定要注意排序規則必須按照要求的主要條件和次要條件來寫
  • 代碼實作

    學生類

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

    public Student() {
    }

    public Student(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 "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        //按照對象的年齡進行排序
        //主要判斷條件: 按照年齡從小到大排序
        int result = this.age - o.age;
        //次要判斷條件: 年齡相同時,按照姓名的字母順序排序
        result = result == 0 ? this.name.compareTo(o.getName()) : result;
        return result;
    }
}      
public class MyTreeSet2 {
    public static void main(String[] args) {
        //建立集合對象
        TreeSet<Student> ts = new TreeSet<>();
        //建立學生對象
        Student s1 = new Student("zhangsan",28);
        Student s2 = new Student("lisi",27);
        Student s3 = new Student("wangwu",29);
        Student s4 = new Student("zhaoliu",28);
        Student s5 = new Student("qianqi",30);
        //把學生添加到集合
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        //周遊集合
        for (Student student : ts) {
            System.out.println(student);
        }
    }
}      

2.4:比較器排序Comparator的使用【應用】

  • 案例需求
  • 存儲老師對象并周遊,建立TreeSet集合使用帶參構造方法
  • 要求:按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序
  • 實作步驟
  • 用TreeSet集合存儲自定義對象,帶參構造方法使用的是比較器排序對元素進行排序的
  • 比較器排序,就是讓集合構造方法接收Comparator的實作類對象,重寫compare(T o1,T o2)方法
  • 重寫方法時,一定要注意排序規則必須按照要求的主要條件和次要條件來寫
  • 代碼實作

    老師類

public class Teacher {
    private String name;
    private int age;

    public Teacher() {
    }

    public Teacher(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 "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}      
public class MyTreeSet4 {
    public static void main(String[] args) {
        //建立集合對象
        TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
            @Override
            public int compare(Teacher o1, Teacher o2) {
                //o1表示現在要存入的那個元素
                //o2表示已經存入到集合中的元素
              
                //主要條件
                int result = o1.getAge() - o2.getAge();
                //次要條件
                result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
                return result;
            }
        });
        //建立老師對象
        Teacher t1 = new Teacher("zhangsan",23);
        Teacher t2 = new Teacher("lisi",22);
        Teacher t3 = new Teacher("wangwu",24);
        Teacher t4 = new Teacher("zhaoliu",24);
        //把老師添加到集合
        ts.add(t1);
        ts.add(t2);
        ts.add(t3);
        ts.add(t4);
        //周遊集合
        for (Teacher teacher : ts) {
            System.out.println(teacher);
        }
    }
}      

2.5:兩種比較方式總結【了解】

  • 兩種比較方式小結
  • 自然排序: 自定義類實作Comparable接口,重寫compareTo方法,根據傳回值進行排序
  • 比較器排序: 建立TreeSet對象的時候傳遞Comparator的實作類對象,重寫compare方法,根據傳回值進行排序
  • 在使用的時候,預設使用自然排序,當自然排序不滿足現在的需求時,必須使用比較器排序
  • 兩種方式中關于傳回值的規則
  • 如果傳回值為負數,表示目前存入的元素是較小值,存左邊
  • 如果傳回值為0,表示目前存入的元素跟集合中元素重複了,不存
  • 如果傳回值為正數,表示目前存入的元素是較大值,存右邊