将 HashMap 打印到 .txt 文件中
Printing a HashMap into a .txt file
现在,我正在尝试使用我的这个方法来打印一个 HashMap 的 .txt 文件,其中包含一个词作为键,以及它在读取的 .txt 文件中出现的次数(完成在另一种方法中)作为值。该方法需要将HashMap Keys按字母顺序排列,然后在单独的.txt文件中打印旁边对应的Value。
这是我的方法代码:
public static void writeVocabulary(HashMap<String, Integer> vocab, String fileName) {
// Converts the given HashMap keys (the words) into a List.
// Collections.sort() will sort the List of HashMap keys into alphabetical order.
List<String> listVal = new ArrayList<String>(vocab.keySet());
Collections.sort(listVal);
try
{
// Creating the writer
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
for (int i = 1; i < listVal.size(); i++) {
out.println(listVal.get(i) + " " + vocab.get(i));
}
out.close();
}
// Catching the file not found error
// and any other errors
catch (FileNotFoundException e) {
System.err.println(fileName + "cannot be found.");
}
catch (Exception e) {
System.err.println(e);
}
}
我的问题是,虽然打印了一个 .txt 文件,并且单词以完美的 ASCII 顺序排列(我需要的),但单词旁边的每个值都返回 null。我尝试了很多不同的方法来解决这个问题,但都无济于事。我认为问题出在我的 'for' 循环中:
for (int i = 1; i < listVal.size(); i++) {
out.println(listVal.get(i) + " " + vocab.get(i));
}
我很确定我的逻辑有问题,但我想不出解决办法。任何帮助将非常感激。提前致谢!
您需要使用正确的地图键从地图中获取值 - 此代码当前使用列表中的索引,而不是列表中的值(这是地图的实际键)。
for (int i = 0; i < listVal.size(); i++) {
out.println(listVal.get(i) + " " + vocab.get(listVal.get(i)));
}
如果您想要所有项目,也从索引 0 开始(请参阅上面循环中的初始条件)。正如评论中所建议的那样,您也可以使用 TreeMap 按顺序遍历地图的键
这是增强的 for 循环可以防止您犯错误的地方。您可以使用 get(key)
:
从 Map
中获取值
for ( String key : listVal ) {
out.println( key + " " + vocab.get(key) );
}
您不需要使用索引遍历列表;相反,您可以使用:
for ( final String key : listVal ) {
out.println( key + " " + vocab.get( key ) );
}
并且您可以使用 TreeSet 进行排序来进一步简化事情:
for ( final String key : new TreeSet<String>( vocab.keySet() ) ) {
out.println( key + " " + vocab.get( key ) );
}
现在,我正在尝试使用我的这个方法来打印一个 HashMap 的 .txt 文件,其中包含一个词作为键,以及它在读取的 .txt 文件中出现的次数(完成在另一种方法中)作为值。该方法需要将HashMap Keys按字母顺序排列,然后在单独的.txt文件中打印旁边对应的Value。
这是我的方法代码:
public static void writeVocabulary(HashMap<String, Integer> vocab, String fileName) {
// Converts the given HashMap keys (the words) into a List.
// Collections.sort() will sort the List of HashMap keys into alphabetical order.
List<String> listVal = new ArrayList<String>(vocab.keySet());
Collections.sort(listVal);
try
{
// Creating the writer
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
for (int i = 1; i < listVal.size(); i++) {
out.println(listVal.get(i) + " " + vocab.get(i));
}
out.close();
}
// Catching the file not found error
// and any other errors
catch (FileNotFoundException e) {
System.err.println(fileName + "cannot be found.");
}
catch (Exception e) {
System.err.println(e);
}
}
我的问题是,虽然打印了一个 .txt 文件,并且单词以完美的 ASCII 顺序排列(我需要的),但单词旁边的每个值都返回 null。我尝试了很多不同的方法来解决这个问题,但都无济于事。我认为问题出在我的 'for' 循环中:
for (int i = 1; i < listVal.size(); i++) {
out.println(listVal.get(i) + " " + vocab.get(i));
}
我很确定我的逻辑有问题,但我想不出解决办法。任何帮助将非常感激。提前致谢!
您需要使用正确的地图键从地图中获取值 - 此代码当前使用列表中的索引,而不是列表中的值(这是地图的实际键)。
for (int i = 0; i < listVal.size(); i++) {
out.println(listVal.get(i) + " " + vocab.get(listVal.get(i)));
}
如果您想要所有项目,也从索引 0 开始(请参阅上面循环中的初始条件)。正如评论中所建议的那样,您也可以使用 TreeMap 按顺序遍历地图的键
这是增强的 for 循环可以防止您犯错误的地方。您可以使用 get(key)
:
Map
中获取值
for ( String key : listVal ) {
out.println( key + " " + vocab.get(key) );
}
您不需要使用索引遍历列表;相反,您可以使用:
for ( final String key : listVal ) {
out.println( key + " " + vocab.get( key ) );
}
并且您可以使用 TreeSet 进行排序来进一步简化事情:
for ( final String key : new TreeSet<String>( vocab.keySet() ) ) {
out.println( key + " " + vocab.get( key ) );
}