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

问题描述 投票:0回答:2

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

马克23

约翰逊32

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

只有读取的名字才会出现此问题。在我给出的例子中,它会发生在马克身上,但如果我改变线条的顺序,把约翰放在第一位,就会发生在他身上,而不是马克。

请记住,密钥是人的名称,值是我为该人创建的对象。

这是我的代码:

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的新手,但任何见解都会非常感激!

提前致谢!

java arraylist hashmap key readfile
2个回答
3
投票

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

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

在你的情况下,它意味着任何单词首先实际上在开始时有一些不可打印的字符,这意味着它不是完​​全匹配。

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

Byte order mark screws up file reading in Java

我只是确保你不是首先添加这些。

一个更简单的解决方案是忽略这些字符,如果它适合你。

line = line.replaceAll("[\0\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

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


1
投票

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

马克23

约翰逊32

如果它之间没有空行则可以正常工作。这是我用于主类的代码

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>();

© www.soinside.com 2019 - 2024. All rights reserved.