根据单词计数解析文本文件

时间:2014-03-21 12:47:21

标签: java sorting map comparator

我在根据单词计数频率解析给定的文本文件时遇到问题。除了订购之外,一切都在发生,基于单词计数。

我的方法

  • 解析文本文件
  • 分裂&存储字符串数组中的每个单词
  • 传递的数组将包含每个唯一单词的计数并传递给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 个答案:

答案 0 :(得分:1)

parser.sortByValue(finalMap);返回您忽略的新(已排序)地图。而是打印旧的(未排序的)finalMap

finalMap = parser.sortByValue(finalMap);

应该解决这个问题。

另请注意,上面的代码会为每个文件创建一个映射,但只打印所有映射中的最后一个映射。

根据您的需要,您应该将地图传递到parser.parseFile(str);以累积所有文件的结果,或者在循环内排序+打印以获得每个文件一个结果。