我正在尝试让扫描仪在使用扫描仪时读取文件路径中字符的频率。我应该添加什么来完成此方法以完成我描述的操作。使用优先级队列。
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);
}
}
}
}
答案 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]);
}
}