【问题标题】:HashMap changing its values after saving and reading it back from a fileHashMap 在保存并从文件中读取后更改其值
【发布时间】: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 字符)中?

标签: java hashmap key-value


【解决方案1】:

我自己找到了问题的解决方案!

我正在从准备好的 WordList 中读取 HashMap 的单词。在这个列表中,两个单词包含完全相同的字母,所以它们在排序后看起来是一样的。在那种情况下,我只是覆盖了 HashMaps 值,因为它们具有相同的键。所以这部分代码甚至都不是错误,我应该下次检查......

不过感谢大家对我问题的回答和建议!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多