【问题标题】:Parsing a text file, based on words count根据字数解析文本文件
【发布时间】:2014-03-21 12:47:21
【问题描述】:

我无法根据字数频率解析给定的文本文件。除了根据字数排序之外,一切都在相应地发生。

我的方法

  • 解析文本文件
  • 将每个单词拆分并存储在字符串数组中
  • 传递的数组将包含每个唯一单词的计数并传递给 Map
  • Map 会根据 Value 对其进行排序

代码如下:

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;
    }
}

这段代码有什么问题?

【问题讨论】:

  • 考虑为变量使用小写名称(即 line 而不是 Line)
  • 考虑适当缩进,目前很难阅读。
  • 您在每个循环转弯处替换您的finalMap(在您的主方法的while 中),您想要吗?
  • @DaniloMuñoz:代码被您的编辑破坏了;比较器的一半不见了。
  • @DaniloMuñoz:不要使用&lt;code&gt;&lt;pre&gt; 来格式化代码;当代码包含&lt; 时会感到困惑。而是选择代码并使用编辑器工具栏中的“代码”按钮。

标签: java sorting map comparator


【解决方案1】:

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

finalMap = parser.sortByValue(finalMap);

应该解决这个问题。

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

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

【讨论】:

  • 感谢 Aaron.. 提供修复和建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 2021-07-05
  • 1970-01-01
相关资源
最近更新 更多