import java.util.*;

public class HitungKata {
    public static void main(String[] args) {
        String teks = "belajar java setiap hari belajar java coding setiap pagi";

        // Versi 1: getOrDefault mengembalikan nilai lama, atau 0 jika key belum ada.
        Map<String, Integer> hitungan = new HashMap<>();
        for (String kata : teks.split(" ")) {
            hitungan.put(kata, hitungan.getOrDefault(kata, 0) + 1);
        }
        System.out.println("getOrDefault : " + hitungan);

        // Versi 2: merge memasang nilai baru lalu menggabungkannya dengan nilai lama.
        Map<String, Integer> hitunganMerge = new HashMap<>();
        for (String kata : teks.split(" ")) {
            hitunganMerge.merge(kata, 1, Integer::sum);
        }
        System.out.println("merge        : " + hitunganMerge);

        // putIfAbsent hanya menulis jika key belum terpasang.
        hitunganMerge.putIfAbsent("algoritma", 1);
        hitunganMerge.putIfAbsent("java", 99);
        System.out.println("putIfAbsent  : algoritma=" + hitunganMerge.get("algoritma")
                + ", java=" + hitunganMerge.get("java"));

        // computeIfAbsent menyiapkan wadah kosong sekali, lalu wadah itu diisi berulang.
        Map<Integer, List<String>> perPanjang = new HashMap<>();
        for (String kata : teks.split(" ")) {
            perPanjang.computeIfAbsent(kata.length(), k -> new ArrayList<>()).add(kata);
        }
        System.out.println("Kelompok panjang kata:");
        perPanjang.forEach((panjang, daftar) ->
                System.out.println("  " + panjang + " huruf : " + daftar));
    }
}
