//TestTreeMapOfStringAndTreeSetOfInteger.java

import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Scanner;

public class TestTreeMapOfStringAndTreeSetOfInteger
{
    public static void main(String[] args)
    {
        System.out.println("=====1=========================");
        //Create empty String/TreeSet of Integer TreeMap, then
        //display content and size.
        TreeMap<String, TreeSet<Integer>> treeMap;
        treeMap = new TreeMap<String, TreeSet<Integer>>();
        System.out.println(treeMap);
        System.out.println(treeMap.size());
        pause(1);

        System.out.println("=====2=========================");
        //Create an empty TreeSet of Integer and display its content and size.
        TreeSet<Integer> treeSetInt;
        treeSetInt = new TreeSet<Integer>();
        System.out.println(treeSetInt);
        System.out.println(treeSetInt.size());
        pause(2);

        System.out.println("=====3=========================");
        //Put two integers into the empty TreeSet and re-display.
        treeSetInt.add(2);
        treeSetInt.add(5);
        System.out.println(treeSetInt);
        System.out.println(treeSetInt.size());
        pause(3);

        System.out.println("=====4=========================");
        //Put a key/value pair into the TreeMap and display.
        treeMap.put("Hello", treeSetInt);
        System.out.println(treeMap);
        System.out.println(treeMap.size());
        System.out.println(treeMap.get("Hello"));
        System.out.println(treeMap.get("Hello").size());
        pause(4);

        System.out.println("=====5=========================");
        //This code segment has no effect because the value set already
        //contains the single value to be added.
        if (treeMap.containsKey("Hello"))
        {
            treeMap.get("Hello").add(5);
        }
        else
        {
            treeSetInt = new TreeSet<Integer>();
            treeSetInt.add(5);
            treeMap.put("Hello", treeSetInt);
        }
        System.out.println(treeMap);
        System.out.println(treeMap.size());
        System.out.println(treeMap.get("Hello"));
        System.out.println(treeMap.get("Hello").size());
        pause(5);

        System.out.println("=====6=========================");
        //This code segment does take effect because the value set
        //does not already contain the single value to be added.
        if (treeMap.containsKey("Hello"))
        {
            treeMap.get("Hello").add(12);
        }
        else
        {
            treeSetInt = new TreeSet<Integer>();
            treeSetInt.add(12);
            treeMap.put("Hello", treeSetInt);
        }
        System.out.println(treeMap);
        System.out.println(treeMap.size());
        System.out.println(treeMap.get("Hello"));
        System.out.println(treeMap.get("Hello").size());
        pause(6);

        System.out.println("=====7=========================");
        //Add a new key/value pair to the HashMap and re-display.
        if (treeMap.containsKey("Good-bye"))
        {
            treeMap.get("Good-bye").add(20);
        }
        else
        {
            treeSetInt = new TreeSet<Integer>();
            treeSetInt.add(20);
            treeMap.put("Good-bye", treeSetInt);
        }
        System.out.println(treeMap);
        System.out.println(treeMap.size());
        System.out.println(treeMap.get("Hello"));
        System.out.println(treeMap.get("Hello").size());
        System.out.println(treeMap.get("Good-bye"));
        System.out.println(treeMap.get("Good-bye").size());
        pause(7);

        System.out.println("=====8=========================");
        //
        //Set<String> keys = treeMap.keySet();

        //Pre Java 8 ...
        //Display all keys, all values and all key/value pairs.
        //Do it first the pre-Java 8 way ...
        for (String s : treeMap.keySet())
        {
            System.out.print(s + " ");
        }
        System.out.println();
        for (TreeSet<Integer> treeSet : treeMap.values())
        {
            System.out.print(treeSet + " ");
        }
        System.out.println();
        for (String s : treeMap.keySet())
        {
            System.out.println(s + " " + treeMap.get(s));
        }
        pause(8);

        System.out.println("=====9=========================");
        //Display all keys, all values and all key/value pairs.
        //Now do it the Java 8 way ...
        treeMap.keySet().forEach(s -> System.out.print(s + " "));
        System.out.println();
        treeMap.values().forEach(i -> System.out.print(i + " "));
        System.out.println();
        treeMap.keySet().forEach
        (
            s -> System.out.println(s + " " + treeMap.get(s))
        );
        pause(9);
    }

    public static void pause(int pauseNumber)
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Pause " + pauseNumber);
        System.out.print("Press Enter to continue ... ");
        keyboard.nextLine();
    }
}
/*  Output (without the pauses):
    =====1=========================
    {}
    0
    =====2=========================
    []
    0
    =====3=========================
    [2, 5]
    2
    =====4=========================
    {Hello=[2, 5]}
    1
    [2, 5]
    2
    =====5=========================
    {Hello=[2, 5]}
    1
    [2, 5]
    2
    =====6=========================
    {Hello=[2, 5, 12]}
    1
    [2, 5, 12]
    3
    =====7=========================
    {Good-bye=[20], Hello=[2, 5, 12]}
    2
    [2, 5, 12]
    3
    [20]
    1
    =====8=========================
    Good-bye Hello
    [20] [2, 5, 12]
    Good-bye [20]
    Hello [2, 5, 12]
    =====9=========================
    Good-bye Hello
    [20] [2, 5, 12]
    Good-bye [20]
    Hello [2, 5, 12]
*/
