import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;

public class PengelompokanBerjenjang {

    record Siswa(String nama, String kelas, int nilai) {}

    public static void main(String[] args) {
        List<Siswa> rombongan = List.of(
            new Siswa("Budi", "XII-1", 78),
            new Siswa("Siti", "X-2", 92),
            new Siswa("Dewi", "X-2", 70),
            new Siswa("Ani", "XI-3", 85),
            new Siswa("Rahmat", "XII-1", 60)
        );

        // groupingBy berjenjang: kelas -> (lulus/remedial) -> daftar nama
        Map<String, Map<Boolean, List<String>>> berjenjang = rombongan.stream()
            .collect(Collectors.groupingBy(Siswa::kelas,
                Collectors.groupingBy(s -> s.nilai() >= 75,
                    Collectors.mapping(Siswa::nama, Collectors.toList()))));
        System.out.println("berjenjang = " + berjenjang);

        // TreeMap sebagai supplier Map: kunci hasil terurut menurut alfabet
        Map<String, Long> terurut = rombongan.stream()
            .collect(Collectors.groupingBy(
                Siswa::kelas, TreeMap::new, Collectors.counting()));
        System.out.println("terurut = " + terurut);
    }
}
