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

/* A PATRICIA Trie is a prefix search tree which 
  stores information in nodes other than its leaves.
  The value being searched for is obtained from the path to 
  its final leaf.

  PATRICIA stands for "Practical Algorithm to 
  Retrieve Information Coded in Alphanumeric". 


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


import java.util.*;

import org.apache.commons.collections4.*;

import org.apache.commons.collections4.trie.*;
import org.apache.commons.collections4.trie.analyzer.*;



public class TrieTester 
{

  public static void main(String[] args) 
  {
    Trie<String, Integer> trie = new PatriciaTrie<>();
    trie.put("car", 1);
    trie.put("cart", 2);
    trie.put("carton", 3);
    trie.put("cartridge", 4);
    trie.put("cartography", 5);
    trie.put("caravan", 6);
    trie.put("carbon", 7);
    trie.put("castle", 8);
    trie.put("coal", 9);
    System.out.println("Trie: " + trie);
    System.out.println("\nTrie values: " + trie.values());

    System.out.println("\nMake unmodifiable");
    Trie<String, Integer> imTrie = TrieUtils.unmodifiableTrie(trie);
    System.out.println("Try to add an entry");
    try {  imTrie.put("cola", 3);   }
    catch(UnsupportedOperationException e)
    {  System.out.println(e);  }

    System.out.println("\nPrefixes:");
    for (String prefix : 
              Arrays.asList("c", "ca", "car", "cart", "carto"))
      System.out.println("  Values for prefix '" + prefix + "': " +
                                  imTrie.prefixMap(prefix) + "\n");

    System.out.println("\nKeys < 'cart': " +
                                      imTrie.headMap("cart"));

    System.out.println("\nKeys >= 'cart': " + imTrie.tailMap("cart"));

    System.out.println("\nKeys between 'cart' and 'carton': " +
                      imTrie.subMap("cart", "carton"));


    System.out.println("\nBits per key:");

    Set<String> keys = imTrie.keySet();
    StringKeyAnalyzer ska = new StringKeyAnalyzer();
    for(String key : keys)
      System.out.println(" " + key + ": " + ska.lengthInBits(key));

  } // end of main()

}  // end of TrieTester class
