【问题标题】:Displaying object values which are stored in a HashMap显示存储在 HashMap 中的对象值
【发布时间】:2017-04-28 15:52:48
【问题描述】:

我有一个 HashMap,其中存储了一个字符串(键)和一个学生对象(值)。我希望遍历哈希并显示每个键/值对。但是,我想显示键,后跟存储在 Student 对象中的字符串名称值。我尝试了几种方法,但每种方法都以某种方式让我失望。我相信我不完全了解“静态”修饰符,也不完全了解如何使用 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()));
        }
    }

这是我读取名称文件的算法:

//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));
        }

这是我的学生类(我已经完成了 getter 和 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(我在 Student 类中的每个变量和方法中添加了“静态”):

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.

【问题讨论】:

  • 因为map.get(key) 返回一个Student,而Student 没有定义toString 方法,请尝试打印map.get(key).getName()。
  • 你也可以为Student覆盖toString()方法
  • 至于最后一个错误,static method只能引用static filed variable ,只能调用static method。

标签: java object hashmap iterator


【解决方案1】:

如果您没有为 Student 类提供 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();

【讨论】:

  • Iterator&lt;String&gt; keySetIterator = map.keySet().iterator(); while(keySetIterator.hasNext()) { String key = keySetIterator.next(); System.out.println("key: " + key + " value: " + map.get(key).getName()); } 像魅力一样工作!
【解决方案2】:

您没有正确访问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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2020-08-14
    • 1970-01-01
    相关资源
    最近更新 更多