package maps;

import java.util.*;

public class MapOperations {
    public static void main(String[] args) {
        Map<Object, Object> retired = new HashMap<Object, Object>();
        retired.put(32,"Malone");
        retired.put(12,"Stockton");
        retired.put(14,"Hornacek");
        retired.put(53, "Eaton");
        System.out.println("Retired: "+retired);
        
        Map<Object, Object> current = new HashMap<Object, Object>();
        current.put(8,"Williams");
        current.put(5,"Boozer");
        current.put(47,"Kirlenko");
        current.put(32, "Bob");
        System.out.println("Current: "+current);
        
        
        System.out.println("\n\nCOMBINE & FILTER\n----------------------");
        
        Map<Object, Object> m = combine(retired,current);
        
        System.out.println(m+" (combined)");
        
        filter(m,"3");
        filter(m,"1");
        
        System.out.println(m+" (filtered)");
        
                
        System.out.println("\n\nGET KEYS & VALUES\n----------------------");
        // Keys
        System.out.print("Keys:");
        System.out.println(m.keySet());
        
        // Values
        System.out.print("Vals:");
        System.out.println(m.values());
        
        
        System.out.println("\n\nEntrySet Iteration\n----------------------".toUpperCase());
        
        //Entry Set (Enhanced For-loop
        for (Map.Entry<Object, Object> e : m.entrySet())
            System.out.println(e.getValue()+" wears no. "+e.getKey());
    
    }
    
    static <K,V> void filter(Map<K,V> m, String s){
        // Filter a map based on some property of its keys.
        for (Iterator<K> it = m.keySet().iterator(); it.hasNext(); )
            if (it.next().toString().contains(s))
                it.remove();
    }
    
    static <K, V> Map<K, V> combine(Map<K, V> defaults, Map<K, V> overrides) {
        Map<K, V> result = new HashMap<K, V>(defaults);
        result.putAll(overrides);
        return result;
    }
}
