i有一个哈希图,其中我存储了一个字符串(键)和一个学生对象(value)。我希望通过哈希进行迭代并显示每个键/值对。但是,我想显示键,然后显示学生对象中存储的字符串名称值。我已经尝试了几种方法,每个方法都以某种方式使我失败。我相信我不完全了解"静态"修饰符,也不完全了解如何使用hashmaps。
这是我的完整程序:
import java.io.*;
import java.util.Scanner;
import java.util.HashMap;
import java.util.Iterator;
public class FinalProgram {
public static void main(String[] args) throws IOException {
nameReader();
}
private static void nameReader() throws IOException {
String nameFile = " ";
String next = " ";
int sNumber = 0;
String formatSNumber = " ";
String sName = " ";
Scanner input = new Scanner(System.in);
HashMap<String, Student> map = new HashMap<>();
try {
System.out.print("Enter the Name file(c:filename.txt): ");
nameFile = input.nextLine();
} catch(IllegalArgumentException e) {
System.out.printf("Invalid input. Please enter"
+ " filename in the form of "
+ "c:filename.txtn", e.getMessage());
}
//Instantiate FileReader and BufferedReader
FileReader freader = new FileReader(nameFile);
BufferedReader Breader = new BufferedReader(freader);
boolean end = Breader.ready();
do {
next = Breader.readLine();
sNumber = Integer.parseInt(next);
formatSNumber = String.format("%03d", sNumber);
sName = Breader.readLine();
Student student = new Student(sName);
map.put(formatSNumber, student);
end = Breader.ready();
} while(end);
Iterator<String> keySetIterator = map.keySet().iterator();
while(keySetIterator.hasNext()) {
String key = keySetIterator.next();
System.out.println("key: " + key + " value: " + map.get(Student.getName()));
}
}
这是我用于读取名称文件的算法:
//Declaration of HashMap
HashMap<String, Student> map = new HashMap<>();
do {
next = Breader.readLine();
sNumber = Integer.parseInt(next);
formatSNumber = String.format("%03d", sNumber);
sName = Breader.readLine();
Student student = new Student(sName);
map.put(formatSNumber, student);
end = Breader.ready();
} while(end);
Iterator<String> keySetIterator = map.keySet().iterator();
while(keySetIterator.hasNext()) {
String key = keySetIterator.next();
System.out.println("key: " + key + " value: " + map.get(key));
}
这是我的学生班(我已经完成了Getters and Setts并制作了一个构造函数,因为我有问题,我将下一步解释:
public class Student {
private String name = " ";
public Student(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
Course course = new Course();
}
现在,当我尝试通过:
迭代地图时while(keySetIterator.hasNext()) {
String key = keySetIterator.next();
System.out.println("key: " + key + " value: " + map.get(key));
}
输出为:
Enter the Name file(c:filename.txt): c:name.txt
key: 001 value: finalprogram.Student@5cbc508c
key: 002 value: finalprogram.Student@3419866c
key: 030 value: finalprogram.Student@63e31ee
它可以将钥匙完美地存储,但是我无法显示出学生对象的名称。我也尝试了静态变量,但是它返回null(我在学生类中的每个变量和方法中添加了'static'):
Enter the Name file(c:filename.txt): c:name.txt
key: 001 value: null
key: 002 value: null
key: 030 value: null
当我尝试直接调用它时:
System.out.println("key: " + key + " value: " + map.get(Student.getName()));
我收到错误:
Non-static method getName() cannot be referenced rom a static context.
如果您不提供学生班的toString()实现,它将打印默认值,这就是您所看到的。您可以覆盖ToString()。
public class Student {
private String name = " ";
public Student(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
Course course = new Course();
public String toString() {
return name;
}
}
对于Student.getName()
,您正在尝试在类上调用一种方法,而不是类的实例。Student.getName()
是您调用静态方法的方式。您想以非静态方法调用key.getName()
之类的东西。
但这实际上不是您的问题。正确的语法将是 map.get(key).getName()
;
您无法正确访问Map()
内容。
System.out.println("key: " + key + " value: " + map.get(Student.getName()));
更改将是:
System.out.println("key: " + key + " value: " + map.get(key).getName()));
您可以这样想到
Student student = map.get(key);
System.out.println("key: " + key + " value: " + student.getName());
另外,您可以编辑 Student()
类在上下文中更静态,如下:
public class Student {
private static String name = " ";
public Student(String name) {
this.name = name;
}
public static void setName(String name) {
this.name = name;
}
public static String getName() {
return name;
}
Course course = new Course();
}
这将摆脱错误:Non-static method getName() cannot be referenced rom a static context.
但是,我不建议使Student()
更加静态。我会在系统输出方法之前建议实例化。
最后,您可以在Student()
类中提供自己的toString()
的实现:
public class Student {
private String name = " ";
// Your code here
...
@Override
public String toString() {
return name;
}
}