Java 显示存储在HashMap中的对象值
我有一个HashMap,其中存储了一个字符串(键)和一个Student对象(值)。我希望遍历散列并显示每个键/值对。但是,我想显示存储在Student对象中的键后跟字符串名称值。我试过好几种方法,每一种都在某种程度上使我失败。我相信我并不完全理解“static”修饰符,也不完全理解如何使用HashMaps 这是我的全部计划:Java 显示存储在HashMap中的对象值,java,object,hashmap,iterator,Java,Object,Hashmap,Iterator,我有一个HashMap,其中存储了一个字符串(键)和一个Student对象(值)。我希望遍历散列并显示每个键/值对。但是,我想显示存储在Student对象中的键后跟字符串名称值。我试过好几种方法,每一种都在某种程度上使我失败。我相信我并不完全理解“static”修饰符,也不完全理解如何使用HashMaps 这是我的全部计划: import java.io.*; import java.util.Scanner; import java.util.HashMap; import java.util
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.txt\n", 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()));
}
}
现在,当我尝试通过以下方式遍历地图时:
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(我在Student类中的每个变量和方法中添加了“static”):
当我试着直接给它打电话时:
System.out.println("key: " + key + " value: " + map.get(Student.getName()));
我收到错误消息:
Non-static method getName() cannot be referenced rom a static context.
如果您没有为学生类提供toString()实现,它将打印您看到的默认值。您可以重写toString() 对于
Student.getName()
,您正在尝试调用类的方法,而不是类的实例Student.getName()
是静态方法的调用方式。对于非静态方法,您需要调用类似于key.getName()
的函数
但这实际上不是你的问题。正确的语法应该是
map.get(key.getName()
如果您没有为学生类提供toString()实现,它将打印您看到的默认值。您可以重写toString()
对于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();
}
这将消除错误:非静态方法getName()不能从静态上下文中引用。
但是,我不建议将Student()
设置为更静态。我建议在系统输出方法之前进行实例化
最后,您可以在Student()
类中提供自己的toString()
实现:
public class Student {
private String name = " ";
// Your code here
...
@Override
public String toString() {
return name;
}
}
您没有正确访问
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();
}
这将消除错误:非静态方法getName()不能从静态上下文中引用。
但是,我不建议将Student()
设置为更静态。我建议在系统输出方法之前进行实例化
最后,您可以在Student()
类中提供自己的toString()
实现:
public class Student {
private String name = " ";
// Your code here
...
@Override
public String toString() {
return name;
}
}
由于
map.get(key)
返回Student
,并且Student
没有定义的toString
方法,请尝试打印map.get(key).getName()
。您还可以覆盖Student
的toString()
方法作为最后一个错误,静态方法
只能引用静态字段变量
并且只能调用静态方法
。因为map.get(key)
返回一个Student
,并且Student
没有定义的toString
方法,请尝试打印map.get(key).getName()
相反。您还可以覆盖学生的toString()
方法。至于最后一个错误,静态方法
只能引用静态字段变量
,并且只能调用静态方法
迭代器keySetIterator=map.keySet().Iterator();while(keySetIterator.hasNext()){String key=keySetIterator.next();System.out.println(“key:+key+”值:+map.get(key.getName());}
工作起来很有魅力<代码>迭代器keySetIterator=map.keySet().Iterator();while(keySetIterator.hasNext()){String key=keySetIterator.next();System.out.println(“key:+key+”值:+map.get(key.getName());}工作起来很有魅力!