集合练习题
考察点:集合的创建,集合的迭代,自定义对象equals方法的重写等。
题目: 学生基本信息查重
需求: 学生有两个属性(姓名、年龄) 学生信息由用户输入,将学生存在集合中 重写equals
方法,让学生进行比较,姓名、年龄一样的学生视作同一个学生,只保留一个学生信息 打印所有学生信息
扩展: 创建学生时自动给学生随机学号,学生学号不可重复,输出所有学生信息,按学号升序排序
基本思路:
- 创建一个Person类,添加属性:name,age; 封装这些属性并分别设置各个属性的方法。
- 根据用户输入的对象个数创建Person对象,接收用户在控制台上输入的每个对象的信息。(注意,将有些Person对象的名字和年龄设置相同),学过异常的可以直接
- 创建一个ArrayList集合,将Person对象添加到ArrayList集合中。
- 使用迭代器迭代输出该List集合
- 重写
equals
,对学生对象的姓名、年龄比较,可以去除ArrayList集合中重复的Person对象。姓名和年龄相同视为重复的Person对象
代码
Person
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age>0&&age<120){
this.age = age;
}else {
this.age = 17;
}
}
@Override
public boolean equals(Object obj) {
Person p = new Person();
//判断传过来的的类型对象时候与调用此方法的类型对象指向同一地址
if (this == obj) {
return true;
}
//判断穿过来的类型对象是不是Person对象
if (obj instanceof Person) {
//进行拆箱
p = (Person) obj;
}
return this.age == p.age && this.name.equals(p.name);
}
}
测试类(用的是Arraylist,满足基本要求)
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
public class AggregateWork {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Person> list = new ArrayList<>();
addTo(scanner, list);
ergodic(list);
System.out.println("----------------");
removeUserList(list);
ergodic(list);
}
//添加数据
public static void addTo(Scanner scanner, ArrayList<Person> list) {
int chose = 0;
do {
Person user = new Person();
System.out.print("请输入姓名:");
user.setName(scanner.next());
//因为有时候手抖会粗心输入的值不是数字类型,所以当输入的值与想要的值不匹配时会报异常(可以看另一篇博文(异常))
//所以对可能报异常的地方用`try...catch`圈起来,有异常不提醒直接跳过本次循环
try {
System.out.print("请输入年龄:");
user.setAge(scanner.nextInt());
} catch (InputMismatchException e) {
System.out.println("年龄错误,重新录入信息!");
//`.nextLine()`可以处理在缓存空间的值,详情可以看`异常`博文里面有个用户上输入案例
scanner.nextLine();
chose = chose - 1;
continue;
}
list.add(user);
chose++;
System.out.println("----------------");
} while (chose < 5);
}
//遍历集合
private static void ergodic(ArrayList<Person> list) {
for (Person p : list) {//增强for循环(`foreach`)
System.out.println(p.getName() + "\t" + p.getAge());
}
}
//删除重复数据
public static void removeUserList(ArrayList<Person> list) {
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size() - 1; j++) {
if (list.get(i).equals(list.get(j))) {//这里是用了重写后的`equals`方法
if (j > i) {
list.remove(list.get(j));
}
}
}
}
}
}
测试类2(用TreeSet集合,完成扩展)
package com.fish.weeklyhomework.treesetdemo;
import java.util.Random;
import java.util.TreeSet;
import java.util.Scanner;
public class WorkMain {
public static void main(String[] args) {
TreeSet<Student> list = new TreeSet<>((o1, o2) -> {
int num = o2.getScore() - o1.getScore();
long num2;
if (num == 0) {
num2 = o1.getNumber() - o2.getNumber();
return Math.toIntExact(num2);
} else {
return num;
}
});
Scanner scanner = new Scanner(System.in);
register(list, scanner);
statistics(list);
for (Student s :
list) {
System.out.println(s.getNumber() + " " + s.getName() + " " + s.getScore());
}
}
//录入学生成绩
public static void register(TreeSet<Student> list, Scanner scanner) {
Random random = new Random();
for (int i = 0; i < 5; i++) {
try {
Student s = new Student();
System.out.print("请输入姓名:");
s.setName(scanner.next());
System.out.print("随机学号:");
// s.setNumber(random.nextInt(65)*random.nextInt(65));
s.setNumber((long) Math.pow(random.nextInt(1000), 2));
System.out.println(s.getNumber());
for (Student s1 : list) {
if (s.getNumber() == s1.getNumber() && s != s1){
throw new Exception();
}
}
System.out.print("请输入成绩:");
s.setScore(scanner.nextInt());
list.add(s);
System.out.println("-----------------------");
} catch (Exception e) {
System.out.println("学号/成绩错误,再来!");
scanner.nextLine();
i = i - 1;
}
}
}
//统计出班级的及格率和优秀率(分数不低于60及格,分数不低于80算优秀)(20分)
public static void statistics(TreeSet<Student> list) {
int pass = 0;//及格人数
int excellent = 0;//优秀人数
for (Student student : list) {
if (student.getScore() >= 60) {
pass = pass + 1;
}
if (student.getScore() >= 80) {
excellent = excellent + 1;
}
}
double passRate = (double) pass / list.size();
double excellentRate = (double) excellent / list.size();
System.out.println("及格人数:" + pass + "\n优秀人数:" + excellent);
System.out.printf("及格率:%.2f%c\n优秀率:%.2f%c\n", passRate, '%', excellentRate, '%');
}
}