Day17练习

本文详细介绍了Set集合(包括HashSet和TreeSet)的基本概念、元素唯一性保证机制、操作方法,以及编程实例演示。通过简答题形式梳理了Set特点,剖析了HashSet和TreeSet在添加和排序上的区别。还提供了实际编程任务,如登录注册、对象存储和排序等场景的代码实现。
摘要由CSDN通过智能技术生成

A:简答题

1、请简述Set集合的特点?

元素唯一 可以添加一个null
存放数据是无序的(添加的顺序和取出的顺序不一致)
取出的顺序是固定的(不是添加顺序)

2、请简述HashSet是如何保证元素唯一性的?

HashSet集合第一次添加元素时 通过调用HashCode()方法计算出元素存放的位置
之后添加相同元素时 调用HashCode()方法计算出哈希值 确定元素位置 若该位置上有元素 就调用equals方法判断两个元素是否相同 若相同则不添加 若不同 则添加在前一个元素之后 形成链表结构

3、请简述TreeSet是如何保证元素唯一性与排序的?

两种方式:构造器不同
1.自然排序(升序排序)
	a.默认不写时 属于自然排序
	b.TreeSet所添加的元素或对象所在的类必须实现Comparable接口 否则无法自然排序
	  保证元素唯一是根据重写Comparable接口中的CompareTo方法 当返回0时表示两个元素相等 不重复存放

2.比较器排序(自定义排序)
	使用匿名内部类实现Comparator接口
	重写Comparator接口中Compare方法 当返回0时表示两个元素相等 不重复存放

4、请把今天讲解的方法在API中查找到,并使用自己的话进行描述

Set
	boolean add(E e) 
    集合中没有元素e时 添加元素e
    boolean addAll(Collection<? extends E> c) 
    集合中没有集合c中的元素时 将指定集合中的所有元素添加到该集合中。 
    void clear() 
    清空集合中的所有元素
    boolean remove(Object o) 
    删除一个元素o  
    boolean removeAll(Collection<?> c) 
    删除一个集合c中的所有元素(两个集合的交集元素)  
    boolean contains(Object o) 
    判断集合中是否有元素o
    boolean containsAll(Collection<?> c) 
    判断集合中是否有集合c的所有元素  
    boolean equals(Object o) 
    将集合中的两个元素进行比较
    boolean isEmpty() 
    判断集合是否为空  
    Iterator<E> iterator() 
    返回此集合中元素的迭代器。  
    default Spliterator<E> spliterator() 
    在这个集合中的元素创建一个 Spliterator。  
    boolean retainAll(Collection<?> c) 
    获取两个集合的交集元素  
    int size() 
    返回该集合中元素个数(其基数)。  
    int hashCode() 
    返回此元素的哈希码值 
    Object[] toArray() 
    返回一个包含此集合中所有元素的数组。  
    <T> T[] toArray(T[] a) 
    返回包含此集合中的所有元素的数组 返回的数组的运行时类型是指定的数组的运行时类型。  

HashSet 
    Object clone() 
    返回该 HashSet实例浅拷贝 元素本身不是克隆  

TreeSet
	TreeSet() 
    构造一个新的、空的树集,根据其元素的自然排序进行排序  
    TreeSet(Collection<? extends E> c) 
    构造一个新的树集包含在指定集合的元素,根据其元素的自然排序排序 
    TreeSet(Comparator<? super E> comparator) 
    构造一个新的、空的树集,根据指定的比较器进行排序  

B:看程序写结果(写出自己的分析理由),程序填空,改错,看程序写结果。

class Student {
    private String name;
    private int age;
    public Student() {}
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void show() {
        System.out.println(name + "..." + age);
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

1、给出以下代码,请问该程序的运行结果是什么?如有问题,请说明原因。

学生类上面已给出Student

class Demo {
    public static void main (String[] args) {
        HashSet<Student> hs= new HashSet<Student>();
        hs.add( new Student("zhangsan", 19 ) );
        hs.add( new Student("zhangsan", 19 ) );
        hs.add( new Student("lisi", 20 ) );
        hs.add( new Student("wangwu", 22 ) );
        for (Student s : hs) {
            s.show();
        }
    }
}
/*
lisi...20
zhangsan...19
zhangsan...19
wangwu...22
在学生类里面没有重写HashCode() equals()方法
无法保证元素的唯一性
*/

2、给出以下代码,请问该程序的运行结果是什么?如有问题,请说明原因。

学生类上面已给出Student

class Demo {
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<Student>();
        ts.add(new Student("zhangsan", 19));
        ts.add(new Student("zhangsan", 19));
        ts.add(new Student("lisi", 20));
        ts.add(new Student("wangwu", 22));
        for (Student s : ts) {
            s.show();
        }
    }
}
/*
默认是自然排序
自然排序需要Student类实现Comparable接口
重写CompareTo方法
*/

3、给出以下代码,请问该程序的运行结果是什么?如有问题,请说明原因。

学生类上面已给出Student

class Demo {
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num1 = s1.getName().compareTo(s2.getName());
                int num2 = (num1 == 0) ? (s1.getAge() - s2.getAge()) : num1;
                return num2;
            }
        });
        ts.add(new Student("zhangsan", 19));
        ts.add(new Student("zhangsan", 19));
        ts.add(new Student("lisi", 20));
        ts.add(new Student("wangwu", 22));
        for (Student s : ts) {
            s.show();
        }
    }
}
/*
lisi...20
wangwu...22
zhangsan...19
*/

C:编程题

1、请编写程序,完成分包版本的登录注册案例

public class Homework01 {
    public static void main(String[] args) {
        //控制循环
        int count = 0;
        //创建数组 存储账号密码
        String[] strings = new String[2];
        //键盘录入
        Scanner sc = new Scanner(System.in);
        //功能展示
        gongNeng(count, strings, sc);
    }

    //功能展示
    private static void gongNeng(int count, String[] strings, Scanner sc) {
        while (count == 0) {
            System.out.println("======================");
            System.out.println("1.注册  2.登录  3.退出");
            System.out.println("输入 1/2/3 选择功能");
            System.out.println("======================");
            //key选择功能
            int key = sc.nextInt();
            if (key != 1 && key != 2 && key != 3) {
                System.out.println("功能选择有误 程序退出");
                break;
            }
            switch (key) {
                case 1:
                    zhuCe(sc,strings);
                    break;
                case 2:
                    dengLu(strings, sc);
                    break;
                case 3:
                    System.out.println("程序退出");
                    count = -1;
                    break;
            }
        }
    }
    
    //注册账号密码
    private static void zhuCe(Scanner sc,String[] strings) {
        //账号:6~12 个字符,可使用字母 数字 下划线 需要以字母开头
        String accountRegex = "[a-zA-Z]\\w{5,11}";
        //密码:6~18 个字符,可使用字母 数字 下划线 不能含有空格
        String passwdRegex = "\\w{6,18}";
        
        System.out.println("账号:6~12 个字符,可使用字母 数字 下划线 需要以字母开头");
        System.out.println("密码:6~18 个字符,可使用字母 数字 下划线 不能含有空格");
        System.out.println("输入账号");
        String zhangHao1 = sc.next();
        if (zhangHao1.matches(accountRegex) == true) {
            System.out.println("输入密码");
            String miMa1 = sc.next();

            if (miMa1.matches(passwdRegex) == true) {
                System.out.println("再次输入密码");
                String miMa2 = sc.next();

                if (miMa1.equals(miMa2)) {
                    System.out.println("注册成功");
                    strings[0] = zhangHao1;
                    strings[1] = miMa1;
                } else {
                    System.out.println("两次密码不一致");
                }

            } else {
                System.out.println("密码规则有误");
            }

        } else {
            System.out.println("账号规则有误");
        }
    }
    
    //登录
    private static void dengLu(String[] strings, Scanner sc) {
        System.out.println("输入账号");
        String zhangHao = sc.next();
        System.out.println("输入密码");
        String miMa = sc.next();
        if (zhangHao.equals(strings[0]) && miMa.equals(strings[1])){
            System.out.println("登录成功");
        }else {
            System.out.println("账号密码有误");
        }
    }
}

2、请编写程序,存储自定义对象到HashSet集合中,并遍历

public class Homework02 {
    public static void main(String[] args) {
        HashSet<Dog> hashSet = new HashSet<>();
        hashSet.add(new Dog("大黄", 2));
        hashSet.add(new Dog("小黄", 1));
        hashSet.add(new Dog("大白", 3));

        //遍历
        System.out.println("---迭代器---");
        Iterator<Dog> iterator = hashSet.iterator();
        while (iterator.hasNext()) {
            Dog dog = iterator.next();
            System.out.println(dog);
        }
        System.out.println("---增强for---");
        for (Dog dog : hashSet) {
            System.out.println(dog);
        }
        System.out.println("---forEach---");
        hashSet.forEach(new Consumer<Dog>() {
            @Override
            public void accept(Dog dog) {
                System.out.println(dog);
            }
        });
    }
}

class Dog {
    private String name;
    private int age;
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3、请编写程序,存储自定义对象到TreeSet集合中,并遍历

a) 采用自然排序方式

b) 采用比较器排序方式

public class Homework03 {
    public static void main(String[] args) {
        //a.采用自然排序方式
        System.out.println("---自然排序---");
        TreeSet<Cat> treeSet1 = new TreeSet<>();
        treeSet1.add(new Cat("大花",3));
        treeSet1.add(new Cat("小花",1));
        treeSet1.add(new Cat("小喵",1));
        //遍历
        treeSet1.forEach(new Consumer<Cat>() {
            @Override
            public void accept(Cat cat) {
                System.out.println(cat);
            }
        });
        
        //b.采用比较器排序方式
        System.out.println("---比较器排序---");
        TreeSet<Cat> treeSet2 = new TreeSet<>(new Comparator<Cat>() {
            //根据年龄 然后名字排序
            @Override
            public int compare(Cat cat1, Cat cat2) {
                int i = cat1.getAge() - cat2.getAge();
                int j = i == 0 ? cat1.getName().compareTo(cat2.getName()) : i;
                return j;
            }
        });
        treeSet2.add(new Cat("大花",3));
        treeSet2.add(new Cat("小花",1));
        treeSet2.add(new Cat("小喵",1));
        //遍历
        treeSet2.forEach(new Consumer<Cat>() {
            @Override
            public void accept(Cat cat) {
                System.out.println(cat);
            }
        });
    }
}

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

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    @Override
    public int compareTo(Cat cat) {
        //根据年龄 然后名字排序
        int i = this.age - cat.age;
        int j = i == 0 ? this.name.compareTo(cat.name) : i;
        return j;
    }
    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;
    }
}

4、请编写程序,完成键盘录入学生信息按照总分排序后输出在控制台,并测试

需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)

按照总分从高到低输出到控制台

public class Homework04 {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        //录入信息
        entryInformation(students);
        //排序
        sort(students);
        //打印
        print(students);
    }
    /*序号 姓名 语文 数学 英语 总成绩
      1	  jies	100	90	90	 280
      2	  king	100	70	110	 280
      3	  wang	90	90	90	 270
      4	  jone	90	80	70	 240
      5	  gong	80	80	60	 220*/
    
    //录入信息
    private static void entryInformation(ArrayList<Student> students) {
        //录入学生信息
        Scanner sc = new Scanner(System.in);
        for (int i = 1; i <= 5; i++) {
            System.out.println("输入第" + i + "个学生名字");
            String name = sc.next();
            System.out.println("输入第" + i + "个学生语文成绩");
            int chinaScore = sc.nextInt();
            System.out.println("输入第" + i + "个学生数学成绩");
            int mathScore = sc.nextInt();
            System.out.println("输入第" + i + "个学生英语成绩");
            int englishScore = sc.nextInt();
            int score = chinaScore + mathScore + englishScore;
            students.add(new Student(name, chinaScore, mathScore, englishScore, score));
        }
    }
    
    //排序
    private static void sort(ArrayList<Student> students) {
        //排序
        students.sort(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //先比总分-语文成绩-数学成绩-英语成绩
                int num1 = s2.getScore() - s1.getScore();
                int num2 = num1 == 0 ? s2.getChinaScore() - s1.getChinaScore() : num1;
                int num3 = num2 == 0 ? s2.getMathScore() - s1.getMathScore() : num2;
                int num4 = num3 == 0 ? s2.getEnglishScore() - s1.getEnglishScore() : num3;
                return num4;
            }
        });
    }
    
    //打印
    private static void print(ArrayList<Student> students) {
        //遍历
        System.out.println("序号 姓名 语文 数学 英语 总成绩");
        students.forEach(new Consumer<Student>() {
            int count = 1;

            @Override
            public void accept(Student student) {
                System.out.println(count++ + "\t" + student);
            }
        });
    }
}

class Student {
    private String name;
    private int chinaScore;//语文成绩
    private int mathScore;//数学成绩
    private int englishScore;//英语成绩
    private int score;//总成绩
    public Student(String name, int chinaScore, int mathScore, int englishScore, int score) {
        this.name = name;
        this.chinaScore = chinaScore;
        this.mathScore = mathScore;
        this.englishScore = englishScore;
        this.score = score;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getChinaScore() {
        return chinaScore;
    }
    public void setChinaScore(int chinaScore) {
        this.chinaScore = chinaScore;
    }
    public int getMathScore() {
        return mathScore;
    }
    public void setMathScore(int mathScore) {
        this.mathScore = mathScore;
    }
    public int getEnglishScore() {
        return englishScore;
    }
    public void setEnglishScore(int englishScore) {
        this.englishScore = englishScore;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    @Override
    public String toString() {
        return name + "\t" +
                chinaScore + "\t" +
                mathScore + "\t" +
                englishScore + "\t" +
                score;
    }
}

5、请编写程序,产生10个1-100之间的随机数要求随机数不能重复,并测试

需求:编写一个程序,获取10个1至100的随机数

​ 要求随机数不能重复,并把最终的随机数输出到控制台。

public class Homework05 {
    public static void main(String[] args) {
        //产生10个1-100之间的随机数要求随机数不能重复
        HashSet<Integer> hashSet = new HashSet<>();
        Random random = new Random();
        while (true) {
            int i = random.nextInt(100) + 1;
            hashSet.add(i);
            if (hashSet.size() == 10) {
                break;
            }
        }
        System.out.println(hashSet);
        //[96, 48, 49, 67, 99, 54, 41, 57, 43, 31]
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值