添加条件以接受HashMap中的特定条目

时间:2016-10-20 08:49:04

标签: java bluej

我的程序是一个简单的学生管理数据库,它收集学生的姓名,科目和电话号码并添加到数据库中。我已经能够实现主要的逻辑操作,如在数据库中添加,删除和搜索学生。我无法限制学生只输入批准的科目,例如"英语","数学"和"计算"添加到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();
    }
}

2 个答案:

答案 0 :(得分:1)

使用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> list = students.entrySet()
                     .stream()
                     .filter(.. some predicate...)
                     .map(Map.Entry::getValue)
                     .collect(Collectors.toList());

答案 1 :(得分:1)

如果您有可能值的受限列表,则可以使用Enum,例如

enum Subject {
    English, Maths, Computing
}

这些集合只是一个EnumSet,您可以通过调用

来检查它的值
EnumSet<Subject> subjects = EnumSet.of(Subject.class);

Subject s = Subject.valueOf(subjectName);
subjects.add(s);