我一直在为大学 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/