3 回答

TA貢獻1847條經驗 獲得超11個贊
優先級隊列相對簡單,它是一個保留順序的堆。雖然 hashmap 在這里可能會更好,但 pqueue 并不可怕。
只需遍歷文件的整個字符數組。將所有內容放入優先隊列。要獲得頻率,只需彈出 pqueue 并將其存儲在地圖或類似的東西中,或者將其輸出到任何需要輸出的地方。
Map 好多了,但是如果你必須使用優先級隊列,那就相對簡單了

TA貢獻1995條經驗 獲得超2個贊
我建議使用簡單的映射而不是優先級隊列。使用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()));
}
}
如果您需要字符的順序,您可以使用 a LinkedHashMap,它保持插入順序。將我上面示例的收集器更改為:
Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting())

TA貢獻1786條經驗 獲得超11個贊
好吧,如果您不想使用 HasMap 或 PriorityQueue,這是一個替代解決方案,您可以使用一個簡單的整數頻率數組來存儲編號。所有字母的出現。我使用了大小為 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]);
}
}
添加回答
舉報