java - 如何在 Java 中读取/写入两个 HashMap 对象到文件中?
问题描述
我一直在做一个项目,我需要将两个哈希映射写入 Java 中的 .dat 文件。我需要能够添加、删除和修改一个employeeMap hashmap,然后将它写入一个文件,对于另一个gradeMap HashMap 也是如此。我在添加、删除或修改哈希图本身时没有任何问题,但我正在努力编写代码以便能够将对象写入文件并从文件中读取对象。这是类代码和主要代码。
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");
}
}
我一直在参考我的教科书和在线讲义,但我似乎无法弄清楚这个问题。任何人都知道我可能做错了什么(我肯定是)?谢谢您的帮助。
解决方案
推荐阅读
- vb.net - 如何向单个参数发送多个值?
- c# - 使用 PdfFormXObject 定位画布和图像
- android - 有没有一种简单的方法可以在 phonegap 中获得手机的指南针航向精度?
- python - Tensorflow 模型:如何从 proto buff 文件中识别输入/输出节点名称?
- bluetooth - 处理/蓝牙到 Arduino
- ruby-on-rails - 嵌套属性并在一个控制器(父控制器)中创建两个独立模型的实例
- typescript - 在 typescript 中避免接口重复解析 JSON
- c# - 代码并不总是突出显示富文本框中的选定文本
- javascript - React 应用程序和 Laravel API 的 CORS 问题
- flutter - 异常:ideviceinfo 返回错误:错误:无法连接到锁定,错误代码 -17