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

标签 java arraylist hashmap key readfile

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

马克23

约翰福音 32 章

.txt 文件包含一些人名,该程序运行良好,但有一个异常(exception):读取列表的第一个名称,并将其存储在 HashMap 中,但每次我使用 map.get 获取它时()map.containsKey() 它告诉我该 key 不存在。

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

请记住,键是该人的姓名,值是我为该人创建的对象 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("[\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

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

关于java - HashMap 包含某个键,但告诉我它没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53119362/

相关文章:

java - Java 中声明的库的 API 在哪里?

java - Java GC 日志行之间有什么区别? ("Total time for which..."与 "[GC")

java - 为什么我的 BufferedInputStream.read() 不能接收 -1?

java - if语句没有在for循环android中执行

java - 从 CSV 文件读取到对象中

java - 无法修改ArrayList元素

java - 将 String[] 转换为 int[](或将 ArrayList<String> 转换为 ArrayList<Integer>)的优雅方式

java - 为什么声明相似的对象名和HashMap没有冲突?

java - 如何解释 Java 8 和 Java 7 中 HashMap 的插入性能

java - java中向Hashmap中插入字符。HashMap中字符的顺序与输入顺序不同