有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    parser.sortByValue(finalMap);返回一个您忽略的新(排序)映射。而是打印旧的(未排序的)finalMap

    finalMap = parser.sortByValue(finalMap);
    

    应该解决这个问题

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

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