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

/*  ListUtils utilities
     * set-like operations 
       (e.g. union, intersection, sum, subtraction)
     * select()
     * partitioning
     * permutations

   Also see CollectionUtilsTester.java, IteratorsTester.java


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


import java.util.*;

import org.apache.commons.collections4.*;
import org.apache.commons.collections4.functors.*;
import org.apache.commons.collections4.iterators.PermutationIterator;



public class ListUtilsTester 
{

  public static void main(String[] args) 
  {
    List<String> list1 = 
         new ArrayList<>(Arrays.asList("one", "two", "three"));
    System.out.println("list1: " + list1);

    List<String> list2 = 
         new ArrayList<>(Arrays.asList("one", "two", "four"));
    System.out.println("list2: " + list2);

    System.out.println("\nUnion: " + ListUtils.union(list1, list2));

    System.out.println("Intersection: " + 
                            ListUtils.intersection(list1, list2));

    System.out.println("Sum: " + ListUtils.sum(list1, list2));

    System.out.println("Subtract: " +
                            ListUtils.subtract(list1, list2));

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

    List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
    System.out.println("\nnums list: " + nums);

    List<Integer> sels = ListUtils.select(nums, n -> (n > 3));
    System.out.println("Select (> 3): " + sels);

    sels = ListUtils.select(nums, n -> !(n > 3));
    System.out.println("Select (<= 3): " + sels);


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

    List<Employee> emps = Arrays.asList(
            new Employee("Bob", "male", "USA"),
            new Employee("Larry", "male", "USA"),
            new Employee("Bill", "male", "USA"),
            new Employee("Sue", "female", "UK"),
            new Employee("Jim", "male", "USA"),
            new Employee("Jane", "female", "UK"),
            new Employee("Joe", "male", "UK"),
            new Employee("Zoe", "female", "MI"));

    System.out.println("\nEveryone: " + emps);

    System.out.println("\nPeople in USA or Female:");
    List<Employee> results = 
          ListUtils.select(emps, 
                 u -> (u.getCountry().equals("USA") ||
                       u.getGender().equals("female")) );
    System.out.println(results);


    System.out.println("\nPeople in UK and Male:");
    results = ListUtils.select(emps, 
                 u -> (u.getCountry().equals("UK") &&
                       u.getGender().equals("male")) );
    System.out.println(results);


    System.out.println("\nPeople with names that start with B:");
    results = ListUtils.select(emps, 
                 u -> u.getName().startsWith("B"));
    System.out.println(results);

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

    System.out.println("\nPartition:");
    System.out.println("nums list: " + nums);
    List<List<Integer>> parts = IterableUtils.partition(nums,
                                   n -> (n < 3));
    System.out.println("parts (n < 3): " + parts);


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

    List<Integer> list = Arrays.asList(1, 2, 3);
    System.out.println("\nPermutations of list: " + list);

    System.out.println("Using CollectionUtils");
    Collection<List<Integer>> perms = 
                    CollectionUtils.permutations(list);
    perms.forEach(System.out::println);
    System.out.println();

    System.out.println("Using PermutationIterator");
    PermutationIterator<Integer> permIter =
                           new PermutationIterator<>(list);
    while (permIter.hasNext())
      System.out.println(permIter.next());

  }  // end of main()

}  // end of ListUtilsTester class
