
// OrderedMapTester.java
// Andrew Davison, ad@coe.psu.ac.th, May 2023

/* A map that maintains order and allows both forward 
   and backward iteration. Uses OrderedMap and LinkedMap.

  Usage:
    > compile OrderedMapTester.java
    > run OrderedMapTester

   Also see:
     LRUMapTester.java
     ExpiringMapTester
     TransformedMapTester
     SplitMapTester
     PredicateMapTester.java
   and
     MapUtilsTester.java

*/

import java.util.*;

import org.apache.commons.collections4.*;
import org.apache.commons.collections4.map.*;


public class OrderedMapTester 
{
  public static void main(String[] args) 
  {
    OrderedMap<String, Integer> map = new LinkedMap<>();
                                // uses insertion order
    map.put("One", 1);
    map.put("Two", 2);
    map.put("Three", 3);
    
    System.out.println("map: " + map);
    System.out.println(map.firstKey());
    System.out.println(map.nextKey("One"));
    System.out.println(map.nextKey("Two"));

    System.out.println("2nd entry: " + map.get("Two"));


    System.out.println("\nIterate forwards...");
    OrderedMapIterator<String, Integer> mapIter =
                                        map.mapIterator();
    int i = 0;
    while (mapIter.hasNext()) {
      mapIter.next();
      System.out.println(i + ". " + mapIter.getKey() + ": " + 
                              mapIter.getValue());
      i++;
    }

    System.out.println("...then backwards");
    while (mapIter.hasPrevious()) {
      String key = mapIter.previous();
      i--;
      System.out.println(i + ". " + key + ": " + map.get(key));
    }

    System.out.println("\nRemove 'Two'");
    Integer twoVal = map.remove("Two");
    System.out.println("Size: " + map.size());


    // add index methods
    System.out.println("\nLinked map:");
    LinkedMap<String, Integer> lmap =
                       (LinkedMap<String, Integer>) map;

    System.out.println("2nd entry: " + lmap.get(1));
    System.out.println("Index of Three: " + lmap.indexOf("Three"));

    List<String> keys = lmap.asList();
    System.out.println("\nList of Keys: " + keys);
  }  // end of main()

}  // end of OrderedMapTester class
