Java扫描仪从文件读取字符频率

时间:2019-05-31 20:04:33

标签: java algorithm hashmap huffman-code

我正在尝试让扫描仪在使用扫描仪时读取文件路径中字符的频率。我应该添加什么来完成此方法以完成我描述的操作。使用优先级队列。

public static Huffman build(String filePath) throws IOException {
    if (filePath == null) {
        throw new NullPointerException("File doesn't exist");
    } else {
        try {
            Scanner file = new Scanner(new File(filePath));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        while (file.hasNextLine()) {
            Scanner s2 = new Scanner(file.nextLine());
            while (s2.hasNext()) {
                String s = s2.next();
                System.out.println(s);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

优先级队列相对简单,它是一个保留顺序的堆。尽管这里的哈希表可能会更好,但是pqueue并不可怕。

只需遍历文件的整个字符数组。将所有内容放入优先级队列。要获得频率,只需弹出队列,然后将其存储在地图或类似的东西中,或者将其输出到需要输出的位置即可。

地图要好很多,但是如果您必须使用优先级队列,则相对来说就很简单

答案 1 :(得分:0)

我建议使用简单的映射而不是优先级队列。使用Files.lines()和Java Stream,您可以使用此代码:

public static Map<String, Long> build(String filePath) throws IOException {
    if (filePath == null) {
        throw new NullPointerException("File doesn't exist");
    }
    try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
        return lines.map(s -> s.split("")).flatMap(Arrays::stream)
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    }
}

如果需要字符的顺序,则可以使用LinkedHashMap,该顺序保持插入顺序。将我上面的示例的收集器更改为:

Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting())

答案 2 :(得分:0)

好吧,如果您不想使用HasMap或PriorityQueue,这是另一种解决方案,您可以使用简单的整数频率数组来存储no。所有字母的出现。我使用大小为128的整数数组来覆盖所有类型的字符,包括大写,小写,特殊字符或数字。 (您可以在将用户输入存储到String之后,立即添加这段代码)

    int[] count = new int[128]; // initially they all will be zero
    for(char ch:s.toCharArray()){
        count[ch]++;
    }
    for(int i=0;i<128;i++){
        if(count[i]!=0){
            System.out.println((char)i+":"+count[i]);
        }
    }