HashMap 包含某个键,但告诉我它没有

HashMap contains a certain key but tells me it doesn't

我一直在为一所大学编写这段代码activity:我需要从 .txt 文件中读取一些行,将它们存储在 HashMap 中并根据文件中的内容打印一些结果。 这些行是一个名字和一个数字,这是那个人的名字和年龄。 例如:

标记 23

约翰 32

.txt 文件包含一些人名,程序运行良好,但有一个例外:列表的第一个名字被读取,存储在 HashMap 中,但每次我用 map.get()map.containsKey() 它告诉我密钥不存在。

此问题仅发生在读取的名字上。 在我给出的示例中, Mark 会发生这种情况,但是如果我更改行的顺序,将 John 放在第一位,它就会发生他,而不是 Mark.

请记住,键是人的名字,值是我为那个人创建的对象 Person。

这是我的代码:

class Person {
    private String name;
    private int age;

    //Getter
    public int getAge() {
        return this.age;
    }

    public String getName() {
        return this.name;
    }

    //Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //toString
    @Override
    public String toString() {
        return name + " " + age;
    }
}
class OpenText {
    public static void textReader(String directory) {
        try {
            BufferedReader file = new BufferedReader(new FileReader(directory));
            String line;
            String[] lineSplit;

            while ((line = file.readLine()) != null) {
                lineSplit = line.split(" ");
                try {
                    int age = Integer.parseInt(lineSplit[1]);
                    Main.hMap.put(lineSplit[0], new Person(lineSplit[0], age));

                } catch (NumberFormatException exc) {
                    System.out.println(exc);
                }
            }

            file.close();
        } catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}
public class Main {

    public static Map<String, Person> hMap = new HashMap<>();

    public static void main(String[] args) {
        OpenText.textReader("DIRECTORY OF THE FILE");
        System.out.println(hMap.keySet());
        System.out.println(hMap.values());
        System.out.println(hMap.get("John"));
    }

    // [John, Mark, Peter, Philip, Mary] 
    // [John 32, Mark 23, Peter 37, Philip 20, Mary 54] 
    // null
}

我想很明显我只是 Java 的新手,但是任何见解都将不胜感激!

提前致谢!

一些文本编辑器会将不可打印的字符添加到文件的开头,以便在另一个文本编辑器读取时它知道使用了什么字符结尾。例如https://en.wikipedia.org/wiki/Byte_order_mark

BufferedReader 不会对这些字符做任何特殊处理,而是将它们视为您看不到的文本。

在你的情况下,这意味着第一个单词实际上在开头有一些不可打印的字符,这意味着它不是完​​全匹配。

要处理任意 BOM,可以使用以下解决方案。

Byte order mark screws up file reading in Java

我只想确保您不会首先添加这些。

一个更简单的解决方案是忽略这些字符(如果适合您的话)。

line = line.replaceAll("[[=10=]\uFFFD]", "");

顺便说一句

BufferedReader br = new BufferedReader(
        new InputStreamReader(
                new ByteArrayInputStream(
                        new byte[]{(byte) 0x0, (byte) 0x0, 'H', 'i', '\n'}
                )));
String line = br.readLine();
System.out.println("line.length()=" + line.length());
System.out.println(line);

打印

line.length()=4
Hi

您需要检查字符串的实际长度是否符合您的预期。

不知道你用的是什么版本的Java。我用一个小的 chnage 尝试了你的代码,它工作正常。只需注意记录之间是否有任何新的空白行。 例如,你不应该有这样的文件内容:

马克 23

约翰福音 32

如果中间没有空行就可以了。这是我用于主要 class

的代码
public class Main {
public static Map<String, Person> hMap = new HashMap<String, Person>();

public static void main(String[] args) {
    OpenText.textReader("C:\Projects\Trials\directory\src\com\hello\nameList.txt");
    System.out.println(hMap.keySet());
    System.out.println(hMap.values());
    System.out.println(hMap.get("John"));
}

}

我刚刚将 HashMap 创建更新为 new HashMap<String, Person>();