Character Frequency Counting ด้วย HashMap
ตัวอย่างโค้ด (ปรับปรุง)
import java.util.*;
public class Demo {
public static void countCharacters(String input) {
if (input == null) return;
Map freq = new LinkedHashMap<>(); // รักษาลำดับการเจอ
for (char c : input.toCharArray()) {
freq.merge(c, 1, Integer::sum); // Java 8+ merge
// หรือ freq.put(c, freq.getOrDefault(c, 0) + 1);
}
// แสดงผล
freq.forEach((ch, count) ->
System.out.println("'" + ch + "' : " + count)
);
}
public static void main(String[] args) {
String str = "Joe Erien";
System.out.println("Character frequencies in: \"" + str + "\"");
countCharacters(str);
}
}
ผลลัพธ์
Character frequencies in: "Joe Erien"
'J' : 1
'o' : 1
'e' : 2
' ' : 1
'E' : 1
'r' : 1
'i' : 1
'n' : 1
เทคนิคอื่นๆ
1. Array (สำหรับ ASCII/Extended ASCII - เร็วที่สุด)
int[] count = new int[256]; // หรือ 65536 สำหรับ char ทั้งหมด
for (char c : str.toCharArray()) count[c]++;
for (int i = 0; i < count.length; i++) {
if (count[i] > 0) System.out.println((char)i + ": " + count[i]);
}
2. Stream API (Java 8+)
Map freq = str.chars()
.mapToObj(c -> (char) c)
.collect(Collectors.groupingBy(c -> c, LinkedHashMap::new, Collectors.counting()));
3. Parallel Stream (ข้อมูลใหญ่)
Map freq = str.chars()
.parallel()
.mapToObj(c -> (char) c)
.collect(Collectors.groupingByConcurrent(c -> c, Collectors.counting()));
Complexity
| Method | Time | Space | Order |
| HashMap | O(n) | O(k) | Insertion (LinkedHashMap) |
| Array[256] | O(n) | O(1) | ASCII order |
| Stream | O(n) | O(k) | Insertion |
k = จำนวน distinct characters