天天看點

Java練習題——集合集合練習題有錯誤或問題請指出

文章目錄

  • 集合練習題
    • 基本思路:
    • 代碼
      • Person
      • 測試類(用的是Arraylist,滿足基本要求)
      • 測試類2(用TreeSet集合,完成擴充)
  • 有錯誤或問題請指出

集合練習題

考察點:集合的建立,集合的疊代,自定義對象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, '%');
    }
}

           

有錯誤或問題請指出