我有一个HashMap术语,其中包含单词出现的页面数,单词在页面中的频率以及它们的位置。
Ex:Word - [页码,页面中的词频,页面中的位置]
cat [1, 3, 1, 2, 5 ], [2, 2, 2, 5 ]
dog [2, 2, 1, 7 ]
如何将此信息存储在易于回读的二进制文件中?
我做了以下尝试:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
for(String word: invertedIndex.keySet()) {
out.writeUTF(word); // Write the word
for(Entry entry: invertedIndex.get(word)) { // Info for a page
out.writeInt(entry.pageNum); // Write its page number
out.writeInt(entry.wordFrequency); // Write its freq in that page
for(int position: entry.positions) {
out.writeInt(position); // Write the positions
}
}
}
byte[] bytes = baos.toByteArray();
FileOutputStream fos = new FileOutputStream(PATH);
fos.write(bytes);
fos.close();
不确定这是否正确...提前致谢。
编辑:谢谢,结果我的问题更多的是关于如何解码这个相当严格的编码。
答案 0 :(得分:2)
有没有办法保留这个数据结构?
是的。很多方法。
提示:您尝试的解决方案是一个良好的开端。
但是,完整的解决方案需要相应的方法来读取数据。当您尝试编写与您的编写代码相对应的读取方法时,您会发现存在系统性问题。例如,没有简单的方法可以确定一个int
值列表的结束位置和下一个值的开始位置。
有办法解决这个问题。 想一想。你怎么能一个接一个地写两个列表,以便你知道哪一个结束而另一个结束呢?
注意:您不必使用ByteArrayOutputStream
。您可以直接写入FileOutputStream
中包含的BufferedOutputStream
。