【发布时间】:2018-09-19 23:21:33
【问题描述】:
我对自己的 Hashmaps 行为感到非常困惑......
HashMap<String, String> wordPairs = new HashMap<String, String>();
String[] lines = {"hello", "frühen", "random"};
char[] letters = new char[lines[1].length-2]
for (int i=1; i<lines[1].length-1; i++) {
letters[i-1] = lines[1].charAt[i];
}
Array.sort(letters);
String str = "";
for (int i=0; i<letters.length; i++) {
str += letters[i];
}
str = String.valueOf(lines[1].charAt(0)) +
String.valueOf(lines[i].charAt(lines[1].length()-1)) + str;
wordPairs.put(str, lines[1]);
此代码块从称为行的字符串数组中读取字符串,并将其作为值与其对应的键一起保存到哈希图中。密钥由相同的字母组成,但顺序不同。当我尝试打印出“str”时,它会为我提供我想要的正确 str,如果我尝试打印与键对应的已放置的值,这也有效。
保存过程如下:
ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(new
File("Wordpairs.wordp")));
output.writeObject(wordPairs);
output.close();
现在是令人困惑的部分:当我现在像这样阅读它时......:
ObjectInputStream input = new ObjectInputStream(new
FileInputStream("Wordpairs.wordp"));
HashMap<String, String> wordPairs = (HashMap<String, String>)input.readObject();
input.close();
...并按如下方式使用它:
String string_temp = "frühen";
System.out.println(string_temp);
System.out.println(wordPairs.get("fnehr" + "\u00b3"));
The first line gives me the real word "frühen".
第二个应该给我完全相同,因为“frühen”以前存储为与字符串“fnehrü”相对应的值(我使用了Unicode点,因为“ü”没有从文件中正确读取,例如用这个代码点创建一个字母)。但相反,第二行给了我“führen”。
如果有人知道发生了什么,非常感谢您的帮助... 也可以随意提出保存和回读 HashMaps 的不同解决方案,我不仅限于 ObjectIn-/OutputStreams!
【问题讨论】:
-
您是否尝试过在保存之前打印出
wordPairs,就像加载后一样?结果是什么? -
我尝试在加载之前为键“fnehrü”打印出适当的值,它给了我想要的正确值:“frühen”...
-
字符集问题?你可以在任何地方指定 UTF8 吗?
-
我不这么认为,因为至少据我所知,ObjectOutputStream 和 ObjectInputStream 都使用了它们的规范字符集,而您不能对此进行干预。
-
您可以在十六进制编辑器中查看文件
"Wordpairs.wordp",以猜测文件是否在保存过程中损坏。这种现象是否也出现在其他字符串(有或没有非 Ascii 字符)中?