最全总结Set集合,HashSet,TreeSet 包含案例

Set集合:

    (1)Set集合的特点

        无序,唯一

    (2)HashSet集合(掌握)

        A:底层数据结构是哈希表(是一个元素为链表的数组)

        B:通过查看add方法的源码,哈希表底层依赖两个方法:hashCode()和equals()

          执行顺序:

            首先比较哈希值是否相同

                相同:继续执行equals()方法

                    返回true:元素重复了,不添加

                    返回false:直接把元素添加到集合

                不同:就直接把元素添加到集合

        C:如何保证元素唯一性的呢?

            由hashCode()和equals()保证的

        D:开发的时候,代码非常的简单,自动生成即可。

        E:HashSet存储字符串并遍历

        F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)


import java.util.HashSet;



/*

 * HashSet集合存储自定义对象并遍历。

 *

 * 注意了:

 *         你使用的是HashSet集合,这个集合的底层是哈希表结构。

 *         而哈希表结构底层依赖:hashCode()和equals()方法。

 *         如果你认为对象的成员变量值相同即为同一个对象的话,你就应该重写这两个方法。

 *         如何重写呢?自动生成即可。

 */

public class DogDemo {

    public static void main(String[] args) {

        // 创建集合对象

        HashSet<Dog> hs = new HashSet<Dog>();



        // 创建狗对象

        Dog d1 = new Dog("秦桧", 25, "红色", '男');

        Dog d2 = new Dog("高俅", 22, "黑色", '女');

        Dog d3 = new Dog("秦桧", 25, "红色", '男');

        Dog d4 = new Dog("秦桧", 20, "红色", '女');

        Dog d5 = new Dog("魏忠贤", 28, "白色", '男');

        Dog d6 = new Dog("李莲英", 23, "黄色", '女');

        Dog d7 = new Dog("李莲英", 23, "黄色", '女');

        Dog d8 = new Dog("李莲英", 23, "黄色", '男');



        // 添加元素

        hs.add(d1);

        hs.add(d2);

        hs.add(d3);

        hs.add(d4);

        hs.add(d5);

        hs.add(d6);

        hs.add(d7);

        hs.add(d8);



        // 遍历

        for (Dog d : hs) {

            System.out.println(d.getName() + "---" + d.getAge() + "---"

                    + d.getColor() + "---" + d.getSex());

        }

    }

}





import java.util.LinkedHashSet;

/*

 * LinkedHashSet:底层数据结构由哈希表和链表组成。

 * 哈希表保证元素的唯一性。

 * 链表保证元素有序。(存储和取出是一致)

 */

public class LinkedHashSetDemo {

    public static void main(String[] args) {

        // 创建集合对象

        LinkedHashSet<String> hs = new LinkedHashSet<String>();



        // 创建并添加元素

        hs.add("hello");

        hs.add("world");

        hs.add("java");

        hs.add("world");

        hs.add("java");



        // 遍历

        for (String s : hs) {

            System.out.println(s);

        }

    }

}

 

  (3)TreeSet集合:排序和唯一

      * TreeSet集合保证元素排序和唯一性的原理

            唯一性:是根据比较的返回是否是0来决定。

            排序:

        A:底层数据结构是红黑树(是一个自平衡的二叉树)

        B:保证元素的排序方式

            a:自然排序(元素具备比较性)

                让元素所属的类实现Comparable接口

                 

/*

 * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口

 */

public class Student implements Comparable<Student> {

    private String name;

    private int age;

    //省略构造器..getxx()Setxx()..



    @Override

    public int compareTo(Student s) {

        // 主要条件 姓名的长度

        int num = this.name.length() - s.name.length();

        // 姓名的长度相同,不代表姓名的内容相同

        int num2 = num == 0 ? this.name.compareTo(s.name) : num;

        // 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄

        int num3 = num2 == 0 ? this.age - s.age : num2;

        return num3;

    }

}

            b:比较器排序(集合具备比较性)

                让集合构造方法接收Comparator的实现类对象


import java.util.Comparator;

import java.util.TreeSet;



/*

 * 需求:请按照姓名的长度排序

 *

 * TreeSet集合保证元素排序和唯一性的原理

 * 唯一性:是根据比较的返回是否是0来决定。

 * 排序:

 *         A:自然排序(元素具备比较性)

 *             让元素所属的类实现自然排序接口 Comparable

 *         B:比较器排序(集合具备比较性)

 *             让集合的构造方法接收一个比较器接口的子类对象 Comparator

 */

public class TreeSetDemo {

    public static void main(String[] args) {

        // 创建集合对象

        // TreeSet<Student> ts = new TreeSet<Student>(); //自然排序

        // public TreeSet(Comparator comparator) //比较器排序

        // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());



        // 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象

        // 而匿名内部类就可以实现这个东西

        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {

            @Override

            public int compare(Student s1, Student s2) {

                // 姓名长度

                int num = s1.getName().length() - s2.getName().length();

                // 姓名内容

                int num2 = num == 0 ? s1.getName().compareTo(s2.getName())

                        : num;

                // 年龄

                int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;

                return num3;

            }

        });



        // 创建元素

        Student s1 = new Student("linqingxia", 27);

        Student s2 = new Student("zhangguorong", 29);

        Student s3 = new Student("wanglihong", 23);

        Student s4 = new Student("linqingxia", 27);

        Student s5 = new Student("liushishi", 22);

        Student s6 = new Student("wuqilong", 40);

        Student s7 = new Student("fengqingy", 22);

        Student s8 = new Student("linqingxia", 29);



        // 添加元素

        ts.add(s1);

        ts.add(s2);

        ts.add(s3);

        ts.add(s4);

        ts.add(s5);

        ts.add(s6);

        ts.add(s7);

        ts.add(s8);



        // 遍历

        for (Student s : ts) {

            System.out.println(s.getName() + "---" + s.getAge());

        }

    }

}

        C:通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。

    (4)案例:

        A:获取无重复的随机数

           

import java.util.HashSet;

import java.util.Random;



/*

 * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。

 *

 * 分析:

 *         A:创建随机数对象

 *         B:创建一个HashSet集合

 *         C:判断集合的长度是不是小于10

 *             是:就创建一个随机数添加

 *             否:不搭理它

 *         D:遍历HashSet集合

 */

public class HashSetDemo {

    public static void main(String[] args) {

        // 创建随机数对象

        Random r = new Random();



        // 创建一个Set集合

        HashSet<Integer> ts = new HashSet<Integer>();



        // 判断集合的长度是不是小于10

        while (ts.size() < 10) {

            int num = r.nextInt(20) + 1;

            ts.add(num);

        }



        // 遍历Set集合

        for (Integer i : ts) {

            System.out.println(i);

        }

    }

}



        B:键盘录入学生按照总分从高到底输出


import java.util.Comparator;

import java.util.Scanner;

import java.util.TreeSet;



/*

 * 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台

 *

 * 分析:

 *         A:定义学生类

 *         B:创建一个TreeSet集合

 *         C:总分从高到底如何实现呢?       

 *         D:键盘录入5个学生信息

 *         E:遍历TreeSet集合

 */

public class TreeSetDemo {

    public static void main(String[] args) {

        // 创建一个TreeSet集合

        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {

            @Override

            public int compare(Student s1, Student s2) {

                // 总分从高到低

                int num = s2.getSum() - s1.getSum();

                // 总分相同的不一定语文相同

                int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;

                // 总分相同的不一定数序相同

                int num3 = num2 == 0 ? s1.getMath() - s2.getMath() : num2;

                // 总分相同的不一定英语相同

                int num4 = num3 == 0 ? s1.getEnglish() - s2.getEnglish() : num3;

                // 姓名还不一定相同呢

                int num5 = num4 == 0 ? s1.getName().compareTo(s2.getName())

                        : num4;

                return num5;

            }

        });



        System.out.println("学生信息录入开始");

        // 键盘录入5个学生信息

        for (int x = 1; x <= 5; x++) {

            Scanner sc = new Scanner(System.in);

            System.out.println("请输入第" + x + "个学生的姓名:");

            String name = sc.nextLine();

            System.out.println("请输入第" + x + "个学生的语文成绩:");

            String chineseString = sc.nextLine();

            System.out.println("请输入第" + x + "个学生的数学成绩:");

            String mathString = sc.nextLine();

            System.out.println("请输入第" + x + "个学生的英语成绩:");

            String englishString = sc.nextLine();



            // 把数据封装到学生对象中

            Student s = new Student();

            s.setName(name);

            s.setChinese(Integer.parseInt(chineseString));

            s.setMath(Integer.parseInt(mathString));

            s.setEnglish(Integer.parseInt(englishString));



            // 把学生对象添加到集合

            ts.add(s);

        }

        System.out.println("学生信息录入完毕");



        System.out.println("学习信息从高到低排序如下:");

        System.out.println("姓名\t语文成绩\t数学成绩\t英语成绩");

        // 遍历集合

        for (Student s : ts) {

            System.out.println(s.getName() + "\t" + s.getChinese() + "\t"

                    + s.getMath() + "\t" + s.getEnglish());

        }

    }

}



发布了114 篇原创文章 · 获赞 52 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Smile_Sunny521/article/details/89703209
今日推荐