Java 显示存储在HashMap中的对象值

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

我有一个HashMap,其中存储了一个字符串(键)和一个Student对象(值)。我希望遍历散列并显示每个键/值对。但是,我想显示存储在Student对象中的键后跟字符串名称值。我试过好几种方法,每一种都在某种程度上使我失败。我相信我并不完全理解“static”修饰符,也不完全理解如何使用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.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());}工作起来很有魅力!