Как читать / записывать два объекта HashMap в файл на Java? - PullRequest
0 голосов
/ 18 октября 2019

Я работал над проектом, в котором мне нужно написать две карты хешей в файл .dat на Java. Мне нужно иметь возможность добавлять, удалять и изменять хэш-карту employeeMap, а затем записывать его в файл, а также для другого HashMap gradeMap. У меня нет проблем с добавлением, удалением или изменением самих хеш-карт, но я изо всех сил пытаюсь написать код, чтобы иметь возможность записывать объекты в файл и читать объекты из файла. Вот код класса и основной код.

import java.io.Serializable;
//class code
public class Employee implements Comparable<Employee>, Serializable
{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String fname;
    private String lname;
    private int ID;

    /**
     * default constructor for the employee class
     */
    Employee()
    {
        setFname("");
        setLname("");
        setID(0);   
    }

    /**
     * 
     * @param ln last name
     * @param fn first name
     * @param id ID number
     */
    Employee(String ln, String fn, int id)
    {
        setFname(fn);
        setLname(ln);
        setID(id);
    }

    /**
     * 
     * @return first name of the employee
     */
    public String getFname() {
        return fname;
    }

    /**
     * 
     * @param fname first name of the  employoee
     */
    public void setFname(String fname) {
        this.fname = fname;
    }

    /**
     * 
     * @return last name of the employee
     */
    public String getLname() {
        return lname;
    }

    /**
     * 
     * @param lname last name of the employee
     */
    public void setLname(String lname){
        this.lname = lname;
    }

    /**
     * 
     * @return ID number
     */
    public int getID(){
        return ID;
    }

    /**
     * 
     * @param iD id number
     */
    public void setID(int iD) 
    {
        this.ID = iD;
    }

    public boolean equals(Object obj)
    {
        if(this == obj)
            return true;
        else if(obj == null)
            return false;
        else if(obj instanceof Employee)
        {
            Employee o = (Employee) obj;
            return this.fname.equals(o.fname) && this.lname.equals(o.lname) && this.ID == o.ID;
        }
        else
            return false;

    }

    public int hashCode() 
    {
        final int HASH_MULTIPLIER = 29;

        int h = HASH_MULTIPLIER * fname.hashCode() + lname.hashCode();
        h = HASH_MULTIPLIER * h + ((Integer) ID).hashCode();

        return h;
    }

    @Override
    public int compareTo(Employee e) 
    {
        if(this.lname.compareTo(e.lname) == 0)
        {
            if(this.fname.compareTo(e.fname) == 0 )
            {
                if(this.ID > e.ID)
                    return 1;
                else if(this.ID == e.ID)
                    return 0;
                else
                    return -1;
            }
        }
        return this.lname.compareTo(e.lname);
    }

    public String toString()
    {
        return("Last Name: " + lname + "\nFirst Name: " + fname + "\nID: " + ID);
    }
}

Основной код

    import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.io.ObjectOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Main {

    private static Scanner in = new Scanner(System.in);

    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException 
    {
        Map <Integer,Employee> employeeMap;
        Map <Employee, Integer> gradeMap;

        File f = new File("Employee.dat");

        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
        if(f.exists())
        {
            try(ObjectInputStream in = new ObjectInputStream(new FileInputStream(f)))
            {
                employeeMap = (HashMap<Integer,Employee>) in.readObject();
                gradeMap = (HashMap<Employee,Integer>) in.readObject();
            }
            catch(Exception e)
            {
                employeeMap = new HashMap<Integer, Employee>();
                gradeMap = new HashMap<Employee, Integer>();
            }
        }
        else
        {
            employeeMap = new HashMap<Integer, Employee>();
            gradeMap = new HashMap<Employee, Integer>();
        }
        int choice = 0;
        do
        {
            choice = printMenuAndGetChoice();

            switch(choice)
            {
            case 1:
                addEmployee(employeeMap, gradeMap);
                out.writeObject(gradeMap);
                out.close();
                break;
            case 2:
                removeEmployee(employeeMap, gradeMap);
                out.writeObject(employeeMap);
                out.writeObject(gradeMap);
                break;
            case 3:
                modifyEmployee(employeeMap, gradeMap);
                out.writeObject(employeeMap);
                out.writeObject(gradeMap);
                break;
            case 4:
                display(gradeMap);
                break;
            case 5:
                break;
            default:
                    break;
            }

        } while(choice != 5);

    }

    public static int printMenuAndGetChoice()
    {

        int choice = 0;
        System.out.println("1) Add an employee");
        System.out.println("2) Remove an employee");
        System.out.println("3) Modify information for an employee");
        System.out.println("4) Print employees");
        System.out.println("5) Exit");
        System.out.println("Choice: ");
        choice = in.nextInt();

        return choice;
    }

    public static void addEmployee(Map<Integer, Employee> employeeMap, Map<Employee, Integer> gradeMap)
    {
        Employee newEmployee = new Employee();
        System.out.println("Enter the last name for this employee");
        newEmployee.setLname(in.next());
        System.out.println("Enter the first name for this employee");
        newEmployee.setFname(in.next());
        System.out.println("Enter the ID for this employee");
        newEmployee.setID(in.nextInt());

        System.out.println("Enter the work performance value (1 - 5) for this employee");
        int performance = in.nextInt();
        int x = 0;

        Set<Employee> empList = gradeMap.keySet();

        for(Employee e: empList)        
            if(e.equals(newEmployee))
            {
                System.out.println("Employee already exists!\n");
                break;
            }

        int hash = newEmployee.getID() * newEmployee.hashCode();
        employeeMap.put(hash, newEmployee);
        gradeMap.put(newEmployee, performance);
    }
    public static void removeEmployee(Map<Integer, Employee> employeeMap, Map<Employee, Integer> gradeMap)
    {
        System.out.println("\nEnter the ID number of the employee to be removed: ");
        int id = in.nextInt();

        if(!employeeMap.containsKey(id))
            System.out.println("The employee does not exist.\n Please enter another ID");
        else
        {
            System.out.println("Employee removed:" + employeeMap.get(id).getFname() + " " + employeeMap.get(id).getLname() + "\n");
            gradeMap.remove(employeeMap.get(id));
            employeeMap.remove(id);
        }
    }

    public static void modifyEmployee(Map<Integer, Employee> employeeMap, Map<Employee, Integer> gradeMap)
    {
        Set<Employee> empList = gradeMap.keySet();

        System.out.println("\nEnter the ID number of the employee to be removed: ");
        int id = in.nextInt();

        if(employeeMap.containsKey(id) == false)
            System.out.println("The employee does not exist.\n Please enter another ID");
        else
        {
            System.out.println("Enter the work performance value (1 - 5) for this employee");
            int performance = in.nextInt();
            gradeMap.put(employeeMap.get(id), performance);
        }
    }

    public static void display(Map<Employee, Integer> gradeMap)
    {
        Set<Employee> empList = gradeMap.keySet();
        for(Employee e: empList)
            System.out.println(e.toString()+ " " +  "\nPerformance: " + gradeMap.get(e) + "\n");
    }
}

Я имел в виду мой учебник и онлайн-лекционные заметки, и я не могу понять,вопрос. У кого-нибудь есть идеи, где я могу делать что-то не так (я определенно)? Спасибо за помощь.

...