
// MultiSetTester.java
// https://apothem.blog/apache-commons-collections.html
// Andrew Davison, ad@coe.psu.ac.th, May 2023

/*  A MultiSet allows for multiple occurrences of each element, 
    keeping track of their count.

    Also see BagTester.java, SetUtilsTester.java

  Usage:
    > compile MultiSetTester.java
    > run MultiSetTester
*/


import java.util.*;

import org.apache.commons.collections4.*;
import org.apache.commons.collections4.multiset.*;
import org.apache.commons.collections4.functors.*;



public class MultiSetTester 
{

  public static void main(String[] args) 
  {
    MultiSet<String> multiSet = new HashMultiSet<>();
    multiSet.add("Java");
    multiSet.add("programming");
    multiSet.add("Python");
    multiSet.add("programming");

    System.out.println("Multiset: " + multiSet);
    System.out.println("No. of elements: " + multiSet.size());
    System.out.println("No. of unique elements: " + 
                               multiSet.uniqueSet().size());
	
    System.out.println("\nMultiSet entries:");
    for (MultiSet.Entry s : multiSet.entrySet())
      System.out.println("  " + s.getElement() + " : " + 
                                  s.getCount());
	
    Set<String> uset = multiSet.uniqueSet();
    System.out.println("\nSet:" + uset);

    // ---------------------------------------

    MultiSet<Integer> ms1 = 
                  new HashMultiSet<>(Arrays.asList(1, 2, 2, 3, 1, 4));
    MultiSet<Integer> predMS =
        PredicatedMultiSet.predicatedMultiSet(ms1,
                            NotNullPredicate.notNullPredicate());
    System.out.println("\nDisallow nulls: " + predMS);
    System.out.println("Try to add a null");
    try {  predMS.add(null);   }
    catch(IllegalArgumentException e)
    {  System.out.println(e);  }

    predMS = PredicatedMultiSet.predicatedMultiSet(ms1,  n -> (n < 10));
    System.out.println("\nDisallow values >= 10: " + predMS);
    System.out.println("Try to add 11");
    try {  predMS.add(11);   }
    catch(IllegalArgumentException e)
    {  System.out.println(e);  }

  }  // end of main()

} // end of MultiSetTester class
