
// MultiKeyMapTester.java
// Andrew Davison, ad@coe.psu.ac.th, May 2023

/* A MultiKeyMap is a Map where multiple keys can be associated
   with a value. However, all the keys must be the same type,
   and a maximum of 5 keys are supported.

   See PartialMultiKeyMapTester.java for a more powerful
   multiple=key map class.

   Usage:
    > compile MultiKeyMapTester.java
    > run MultiKeyMapTester

   Other multi-map examples:
      * BidiMapTester.java
      * PartialMultiKeyMapTester.java
      * MultiValuedMapTester.java

   Also see:
     LRUMapTester.java
     OrderedMapTester.java
     ExpiringMapTester
     TransformedMapTester
     SplitMapTester
     PredicateMapTester.java
   and
     MapUtilsTester.java

*/

import org.apache.commons.collections4.map.*;


public class MultiKeyMapTester 
{
  public static void main(String[] args) 
  {
    MultiKeyMap<String,Integer> marks = new MultiKeyMap<>();
          // note that String applies to all the keys

    marks.put("Jim", "Midterm", "English", 92);
                       // Last parameter is value against defined keys;
                       // up to 5 keys are allowed
    marks.put("Jim", "Midterm", "Maths", 100);
    marks.put("Jim", "Final", "English", 90);
    marks.put("Jim", "Final", "Math", 95);
    marks.put("Bill", "Midterm", "Math", 45);
    marks.put("Bill", "Final", "Math", 52);

    System.out.println("Map: " + marks);

    System.out.println("\nIterate over key:value pairs:");
    marks.forEach((key, value) -> System.out.println(" " + key + ":" + value));

    System.out.println("\nJim's scores in English: " + 
                                marks.get("Jim", "English"));
       // this will print null since did not specify the exam

    System.out.println("Jim's score in Midterm English: " + 
                      marks.get("Jim", "Midterm", "English"));

    System.out.println("Bill's score in Final Maths: " + 
                       marks.get("Bill", "Final", "Math"));


    System.out.println("\nRemove English mark in Final by Jim:");
    marks.removeAll("Jim", "Final", "English");
                   // keys must be in order
    System.out.println("Map: " + marks);

    System.out.println("\nRemove all marks in Midterm by Jim:");
    marks.removeAll("Jim", "Midterm");   
                   // keys must be in order
    System.out.println("Map: " + marks);

    System.out.println("\nRemove all marks scored by Jim:");
    marks.removeAll("Jim");
                   // keys must be in order
    System.out.println("Map: " + marks);

  } // end of main()

}  // end of MultiKeyMapTester class