
// ComparatorsTester.java
// https://justamonad.com/comparator-apache-collections-with-examples/
// Andrew Davison, ad@coe.psu.ac.th, May 2023

/* Examples using ComparatorUtils.

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


import java.util.*;
import java.util.stream.Collectors;

import org.apache.commons.collections4.*;



public class ComparatorsTester 
{

  public static void main(String[] args) 
  {
    List<String> strings = 
            Arrays.asList("aaa", "aa", "a", "zzz", "zz", "z");
    System.out.println("List: " + strings);

    strings.sort(ComparatorUtils.naturalComparator());
    System.out.println("naturalComparator: " + strings);

    strings = Arrays.asList("aaa", "aa", "a", "zzz", "zz", "z");
    strings.sort(Comparator.naturalOrder());
    System.out.println("naturalOrder: " + strings);

    strings = Arrays.asList("aaa", "aa", "a", "zzz", "zz", "z");
    strings.sort(ComparatorUtils.reversedComparator(null));
    System.out.println("reversedComparator using null: " + strings);

    strings = Arrays.asList("azz", "aa", "zzz", "aaaa", "zz", "z");
    strings.sort(ComparatorUtils.reversedComparator(
          (s1, s2) -> Integer.compare(s1.length(), s2.length())));
    System.out.println("reversedComparator using length: " + strings);

    strings = Arrays.asList("azz", "aa", "zzz", "aaaa", "zz", "z");
    Comparator<String> comparator = 
              (s1, s2) -> Integer.compare(s1.length(), s2.length());
    strings.sort(comparator.reversed());
    System.out.println("reversed using length: " + strings);


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

    List<Boolean> booleanVals = 
         Arrays.asList(false, false, true, false, true,true);
    System.out.println("\nBoolean list: " + booleanVals);

    boolean trueValuesFirst = true;
    List<Boolean> collect = booleanVals.stream().sorted(
             ComparatorUtils.booleanComparator(trueValuesFirst)).
                                       collect(Collectors.toList());
    System.out.println("True first: " + collect);

    trueValuesFirst = false;
    collect = booleanVals.stream().sorted(
               ComparatorUtils.booleanComparator(trueValuesFirst)).
                                   collect(Collectors.toList());
    System.out.println("False first: " + collect);

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

    strings = Arrays.asList("azz", null, "aa", "zzz", null, 
                            null, "aaaa", "zz", "z");
    System.out.println("\nList with nulls: " + strings);
    strings.sort(ComparatorUtils.nullLowComparator(
              (s1, s2) -> Integer.compare(s1.length(), s2.length())));
    System.out.println("null Low: " + strings);


    strings = Arrays.asList("azz", null, "aa", "zzz", null, 
                             null, "aaaa", "zz", "z");
    strings.sort(Comparator.nullsFirst(
             (s1, s2) -> Integer.compare(s1.length(), s2.length())));
    System.out.println("nulls First: " + strings);


    strings = Arrays.asList("azz", null, "aa", "zzz", null, 
                             null, "aaaa", "zz", "z");
    strings.sort(ComparatorUtils.nullHighComparator(
             (s1, s2) -> Integer.compare(s1.length(), s2.length())));
    System.out.println("null High: " + strings);


    strings = Arrays.asList("azz", null, "aa", "zzz", null, 
                             null, "aaaa", "zz", "z");
    strings.sort(Comparator.nullsLast(
            (s1, s2) -> Integer.compare(s1.length(), s2.length())));
    System.out.println("nulls Last: " + strings);

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

    Comparator<String> strLength = 
              (s1, s2) -> Integer.compare(s1.length(), s2.length());
    System.out.println("\nCompare 'Sansa' and 'Jon':");
    String min = ComparatorUtils.min("Sansa", "Jon", strLength);
    System.out.println("min: " + min);

    strLength = (s1, s2) -> Integer.compare(s1.length(), s2.length());
    min = ComparatorUtils.max("Sansa", "Jon", strLength);
    System.out.println("max: " + min);
  } // end of main()

}  // end of ComparatorsTester class
