java解析文本文件,基于字数
根据单词计数频率解析给定的文本文件时遇到问题。一切都在相应地发生,除了根据字数排序
我的方法
- 解析文本文件
- 拆分&;将每个单词存储在字符串数组中
- 传递的数组将具有每个唯一单词的计数,并传递给映射
- Map将根据值对其进行排序
代码如下:
public class TestApp {
public static void main(String[] args) throws IOException {
String Line = null;
Map<String, Integer> finalMap = new HashMap<String, Integer>();
FileParser parser = new FileParser();
Reader fileReader = new FileReader("E:\\21350.txt");
BufferedReader bufferReader = new BufferedReader(fileReader);
while ((Line = bufferReader.readLine()) != null) {
String[] str = Line.split("\\s");
finalMap = parser.parseFile(str);
}
// new TestApp().showEntry(finalMap); // Before
parser.sortByValue(finalMap);
new TestApp().showEntry(finalMap); // After
bufferReader.close();
}
public void showEntry(Map<String, Integer> map) {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " --> " + entry.getValue());
}
}
}
public class FileParser {
Map<String, Integer> map = new HashMap<String, Integer>();
public Map<String, Integer> parseFile(String[] strArray) {
for (String key : strArray) {
int counter = 1;
if (map.containsKey(key))
map.put(key, map.get(key) + 1);
else
map.put(key, counter);
}
return map;
}
public Map<String, Integer> sortByValue(Map<String, Integer> map) {
List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
int x = (Integer) ((Map.Entry) o1).getValue();
int y = (Integer) ((Map.Entry) o2).getValue();
if (x > y)
return -1;
else if (x < y)
return 1;
else
return 0;
}
});
Map<String, Integer> result = new LinkedHashMap<String, Integer>();
Iterator it = list.iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> entry = (Map.Entry) it.next();
result.put(entry.getKey(), entry.getValue());
}
return result;
}
}
这个代码有什么问题
# 1 楼答案
parser.sortByValue(finalMap);
返回一个您忽略的新(排序)映射。而是打印旧的(未排序的)finalMap
应该解决这个问题
还要注意,上面的代码为每个文件创建一个映射,但只打印所有映射中的最后一个
根据需要,您应该将映射传递到
parser.parseFile(str);
以累积所有文件的结果,或者在循环中排序+打印以获得每个文件的一个结果