src/main/java/org/organicdesign/fp/collections/PersistentHashMap.java
private static <K,V> INode<K,V>[] cloneAndSet(INode<K,V>[] array, int i, INode<K,V> a) {
        INode<K,V>[] clone = array.clone();
        clone[i] = a;
        return clone;
    }
private static <K,V> INode<K,V>[] cloneAndSet(INode<K,V>[] array, int i, INode<K,V> a) {
        INode<K,V>[] clone = array.clone();
        clone[i] = a;
        return clone;
    }
private static < K , V > INode < K , V > [ ] cloneAndSet ( INode < K , V > [ ] array , int i , INode < K , V > a ) { INode < K , V > [ ] clone = array . clone ( ) ; clone [ i ] = a ; return clone ; }
/*
public static void main(String[] args){
try
{
ArrayList words = new ArrayList();
Scanner s = new Scanner(new File(args[0]));
s.useDelimiter(Pattern.compile("\\W"));
while(s.hasNext())
{
String word = s.next();
words.add(word);
}
System.out.println("words: " + words.size());
ImMap map = PersistentHashMap.EMPTY;
ImMap map = new PersistentHashMap();
Map ht = new Hashtable();
Map ht = new HashMap();
Random rand;

System.out.println("Building map");
long startTime = System.nanoTime();
for(Object word5 : words)
{
map = map.assoc(word5, word5);
}
rand = new Random(42);
ImMap snapshotMap = map;
for(int i = 0; i < words.size() / 200; i++)
{
map = map.without(words.get(rand.nextInt(words.size() / 2)));
}
long estimatedTime = System.nanoTime() - startTime;
System.out.println("size = " + map.size() + ", time: " + estimatedTime / 1000000);

System.out.println("Building ht");
startTime = System.nanoTime();
for(Object word1 : words)
{
ht.put(word1, word1);
}
rand = new Random(42);
for(int i = 0; i < words.size() / 200; i++)
{
ht.remove(words.get(rand.nextInt(words.size() / 2)));
}
estimatedTime = System.nanoTime() - startTime;
System.out.println("size = " + ht.size() + ", time: " + estimatedTime / 1000000);

System.out.println("map lookup");
startTime = System.nanoTime();
int c = 0;
for(Object word2 : words)
{
if(!map.contains(word2))
++c;
}
estimatedTime = System.nanoTime() - startTime;
System.out.println("notfound = " + c + ", time: " + estimatedTime / 1000000);
System.out.println("ht lookup");
startTime = System.nanoTime();
c = 0;
for(Object word3 : words)
{
if(!ht.containsKey(word3))
++c;
}
estimatedTime = System.nanoTime() - startTime;
System.out.println("notfound = " + c + ", time: " + estimatedTime / 1000000);
System.out.println("snapshotMap lookup");
startTime = System.nanoTime();
c = 0;
for(Object word4 : words)
{
if(!snapshotMap.contains(word4))
++c;
}
estimatedTime = System.nanoTime() - startTime;
System.out.println("notfound = " + c + ", time: " + estimatedTime / 1000000);
}
catch(FileNotFoundException e)
{
e.printStackTrace();
}

}
/ * public static void main ( String [] args ) { try { ArrayList words = new ArrayList () ; Scanner s = new Scanner ( new File ( args [ 0 ] )) ; s . useDelimiter ( Pattern . compile ( \\ W )) ; while ( s . hasNext () ) { String word = s . next () ; words . add ( word ) ; } System . out . println ( words : + words . size () ) ; ImMap map = PersistentHashMap . EMPTY ; ImMap map = new PersistentHashMap () ; Map ht = new Hashtable () ; Map ht = new HashMap () ; Random rand ;