Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

โปรแกรม Java นับจำนวนตัวอักษรใน String ด้วย HashMap

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

k = จำนวน distinct characters

MethodTimeSpaceOrder
HashMapO(n)O(k)Insertion (LinkedHashMap)
Array[256]O(n)O(1)ASCII order
StreamO(n)O(k)Insertion