【问题标题】:Adding a condition to accept specific entries in HashMap添加条件以接受 HashMap 中的特定条目
【发布时间】:2017-03-02 04:07:33
【问题描述】:

我的程序是一个简单的学生管理数据库,它收集学生的姓名、科目和电话号码并添加到数据库中。我已经能够实现在数据库中添加、删除和搜索学生等主要的逻辑操作。在添加到 HashMap 集合时,我无法限制学生仅输入已批准的科目,例如“英语”、“数学”和“计算”。任何帮助,将不胜感激。主要代码如下:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Scanner;

public class Menu {
    private HashMap<String, Student> students;

    public Menu() {
        students = new HashMap<String, Student>();
    }

    private void eventLoop() {
        Scanner scanner = new Scanner(System.in);
        int choice = 0;
        boolean exit = false;
        this.readFromFile();

        while (!exit) {
            System.out.println("Welcome to Student Management System");
            System.out.println("==============================");
            System.out.println("(1) Add new student");
            System.out.println("(2) Delete a student");
            System.out.println("(3) Find Student By Name");
            System.out.println("(4) List Students By Subject");
            System.out.println("(5) List All Students");
            System.out.println("(6) Exit System");
            System.out.println("Choose an option: ");

            try {
                choice = Integer.parseInt(scanner.nextLine());
                System.out.print('\u000C');
                if (choice < 1 || choice > 6) {
                    System.err.println("Error : Choose an option between 1 and 6");
                    choice = 0;
                }
            } catch (NumberFormatException e) {
                System.err.println("Error : Choose an option between 1 and 6");
                choice = 0;
            }

            switch (choice) {
                case 1:
                this.addStudent(scanner);
                break;
                case 2:
                this.deleteStudent(scanner);
                break;
                case 3:
                this.findStudentByName(scanner);
                break;
                case 4:
                this.findStudentsBySubject(scanner);
                break;
                case 5:
                this.listStudents();
                break;
                case 6:
                this.writeToFile();
                exit = true;
            }
        }
        scanner.close();
    }

    private void findStudentsBySubject(Scanner scanner) {
        System.out.println("Enter the exact name of the subject:");
        String subjectStr = scanner.nextLine();
        boolean atleastOne = false;
        for (String name : students.keySet()) {
            if (students.get(name).getSubject().getName().toLowerCase().equals(subjectStr.toLowerCase())) {
                System.out.println(students.get(name));
                atleastOne = true;
            }
        }
        if (!atleastOne) {
            System.err.println("No students have enrolled for this subject.");
        }
    }

    private void findStudentByName(Scanner scanner) {
        System.out.println("Enter the exact name of the Student to search:");
        String name = scanner.nextLine();
        if (students.get(name.toLowerCase()) != null) {
            System.out.println("Student details:");
            System.out.println(students.get(name.toLowerCase()));
        } else {
            System.err.println(name + " not found in the database.");
        }
    }

    private void deleteStudent(Scanner scanner) {
        System.out.println("Enter the exact name of the Student to delete:");
        String name = scanner.nextLine();
        if (students.get(name.toLowerCase()) != null) {
            students.remove(name.toLowerCase());
            System.err.println("Student " + name + " deleted from the database.");
        } else {
            System.err.println(name + " not found in the database.");
        }
    }

    private void addStudent(Scanner scanner) {
        System.out.println("The information should be comma separated and in a single line.");
        System.out.println("If the name is not unique, the system will throw an error.");
        System.out.println("Enter the name, phone and subject of the new student.");

        String line = scanner.nextLine();
        System.out.print('\u000C');
        String[] info = line.split(",");
        if (info.length != 3) {
            System.err.println("Please enter the information in the proper format.");
            return;
        }
        String name = info[0];
        String phone = info[1];
        String subjectStr = info[2];

        if (students.get(name.toLowerCase()) != null) {
            System.err.println("This student already exists in the database.");
            return;
        }
        if (phone.length() != 9) {
            System.err.println("The phone number must contain exactly 9 digits.");
            return;
        }
        if (phone.charAt(0) != '9') {
            System.err.println("The phone number must start with '9'.");
            return;
        }
        if (!phone.matches("^[0-9]*$")) {
            System.err.println("The phone number must contain only numbers.");
            return;
        }
        students.put(name.toLowerCase(), new Student(name, new Subject(subjectStr), phone));
        System.err.println("Student added successfully");
    }

    private void listStudents() {
        for (String name : this.students.keySet()) {
            System.out.println(this.students.get(name));
        }
    }

    private void readFromFile() {
        try {
            BufferedReader br = new BufferedReader(new FileReader(new File("./students.txt")));
            String line;
            while ((line = br.readLine()) != null) {
                String[] info = line.split(",");
                String name = info[0];
                String phone = info[1];
                String subjectName = info[2];

                if (students.get(name.toLowerCase()) == null) {
                    Subject subject = new Subject(subjectName);
                    students.put(name.toLowerCase(), new Student(name, subject, phone));
                } else {
                    System.err.println("There seems to be a duplicate student in the file.");
                }
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void writeToFile() {
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(new File("./students.txt")));
            for (String name : students.keySet()) {
                bw.write(students.get(name).toString());
                bw.newLine();
            }
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Menu menu = new Menu();
        menu.eventLoop();
    }

}

学科类别:

public class Subject {
    private String name;
    public Subject(String subjectName) {
        this.setName(subjectName);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return this.getName();
    }
}

【问题讨论】:

    标签: java bluej


    【解决方案1】:

    当你有一个可能值的受限列表时,你可以使用枚举,例如

    enum Subject {
        English, Maths, Computing
    }
    

    这些集合只是一个 EnumSet,你可以通过调用来检查它的值

    EnumSet<Subject> subjects = EnumSet.of(Subject.class);
    
    Subject s = Subject.valueOf(subjectName);
    subjects.add(s);
    

    【讨论】:

    • 感谢您的意见。我如何将其添加到我的主题课程中?我已经更新了我的问题并包含了我已经拥有的主题课程。
    【解决方案2】:

    使用streamfilter 您可以轻松实现这一目标

                     students.entrySet()
                             .stream()
                             .filter(.. some predicate...)
                             .map(Map.Entry::getValue)
                             .collect(Collectors.toList())
    

    如果您确定最多只能获得一个通过过滤器的元素(由您的过滤器保证),您可以使用 findFirst :

    Optional<List> o = students.entrySet()
                          .stream()
                          .filter( e -> e.getKey() == 1)
                          .map(Map.Entry::getValue)
                          .findFirst();
    

    一般情况下,如果过滤器可能匹配多个List,你可以将它们收集到List of Lists中:

    List<List> list = students.entrySet()
                         .stream()
                         .filter(.. some predicate...)
                         .map(Map.Entry::getValue)
                         .collect(Collectors.toList());
    

    【讨论】:

    • 感谢您的意见。您能否编辑我的问题中的答案,以便我更好地理解它?
    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2016-02-06
    相关资源
    最近更新 更多