我在根据单词计数频率解析给定的文本文件时遇到问题。除了订购之外,一切都在发生,基于单词计数。
我的方法
以下是代码:
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;
}
}
这段代码出了什么问题?
答案 0 :(得分:1)
parser.sortByValue(finalMap);
返回您忽略的新(已排序)地图。而是打印旧的(未排序的)finalMap
。
finalMap = parser.sortByValue(finalMap);
应该解决这个问题。
另请注意,上面的代码会为每个文件创建一个映射,但只打印所有映射中的最后一个映射。
根据您的需要,您应该将地图传递到parser.parseFile(str);
以累积所有文件的结果,或者在循环内排序+打印以获得每个文件一个结果。