import java.util.*;

/**
 * An example that demonstrates the use of a local class, an anonymous class,
 * and a lambda expression for comparing String objects based on their
 * length.
 * 
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 *
 */
public class ComparatorExample 
{
  /**
   * The entry point of the application.
   * 
   * @param data The command-line arguments (to sort)
   */
  public static void main(String[] data)
  {
    // Not using a comparator (i.e., using the natural ordering)
    Arrays.sort(data);
    print(data);
    
//[local
    class LengthComparator implements Comparator<String>
    {
      public int compare(String a, String b)
      {
        if (a == null) a = "";
        if (b == null) b = "";
        
        if      (a.length() > b.length()) return  1;
        else if (a.length() < b.length()) return -1;
        else                              return  0;
      }
    }
    
    Arrays.sort(data, new LengthComparator());
//]local
    print(data);

    
    
//[anonymous    
    Arrays.sort(data, new Comparator<String>()
        {
          public int compare(String a, String b)
          {
            if (a == null) a = "";
            if (b == null) b = "";
        
            if      (a.length() > b.length()) return  1;
            else if (a.length() < b.length()) return -1;
            else                              return  0;
          }      
        });
//]anonymous
    print(data);
    
    
    
//[lambda 
    Arrays.sort(data, (String a, String b) -> 
      {
        if (a == null) a = "";
        if (b == null) b = "";
    
        if      (a.length() > b.length()) return  1;
        else if (a.length() < b.length()) return -1;
        else                              return  0;
      }      
    );
//]lambda    
    print(data);
  }

  /**
   * Print an array of String objects.
   * 
   * @param data  The array of String objects
   */
  private static void print(String[] data)
  {
      for (String s: data) System.out.println(s);
      System.out.println("--------");
  }
}
