package commons.collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import basics.utl.EmptyIterator;
public class MapSetOfStrings
{

private Map<String, Set<String>> outer = new HashMap<String, Set<String>>();

public synchronized void put (String k1, String k2)
{
   Set<String> i = contains(k1) ? get(k1) : new HashSet<String>();
   i.add(k2);
   outer.put(k1, i);
}

public Map<String, Set<String>> getOuter ()
{
   return outer;
}

public void setOuter (Map<String, Set<String>> outer)
{
   this.outer = outer;
}

public void putMutualExclusive (String k1, String k2)
{
   if (contains(k1, k2))
      return;
   else if (contains(k2, k1))
      return;
   else
   {
      Set<String> i = new HashSet<String>();
      if (contains(k1))
      {
         i = get(k1);
         i.add(k2);
         outer.put(k1, i);
      }
      else if (contains(k2))
      {
         i = get(k2);
         i.add(k1);
         outer.put(k2, i);
      }
      else
      {
         i = new HashSet<String>();
         i.add(k2);
         outer.put(k1, i);
      }
   }
}

public int size ()
{
   return outer.size();
}

public void clear ()
{
   outer.clear();
}

public Iterator<String> keyIterator ()
{
   return outer.keySet().iterator();
}

public Set<String> get (String key)
{
   return (Set<String>) outer.get(key);
}

public boolean contains (String key)
{
   return outer.containsKey(key);
}

public boolean contains (String k1, String k2)
{
   return outer.containsKey(k1) && ((Set<String>) outer.get(k1)).contains(k2);
}

public Iterator<String> getInnerIterator (String key)
{
   if (!contains(key))
      return new EmptyIterator<String>();
   return outer.get(key).iterator();
}

public long signs ()
{
   long signs = 0;
   for (Iterator<String> I = keyIterator(); I.hasNext();)
   {
      String okey = I.next();
      signs += okey.length();
      Set<String> set = get(okey);
      Iterator<String> II = set.iterator();
      while (II.hasNext())
      {
         signs += II.next().length();
      }
   }
   return signs;
}

public String toString ()
{
   StringBuilder s = new StringBuilder();
   int osize = outer.size();
   long signs = 0;
   if (osize == 0)
   {
      s.append("0");
   }
   else
   {
      s.append(osize);
      s.append("x");
      long counter = 0;
      for (Iterator<String> I = keyIterator(); I.hasNext();)
      {
         String okey = I.next();
         signs += okey.length();
         Set<String> set = get(okey);
         Iterator<String> II = set.iterator();
         while (II.hasNext())
         {
            counter++;
            signs += II.next().length();
         }
      }
      long d = counter / osize;
      s.append(d);
      s.append(":");
      s.append(signs);
   }
   return s.toString();
}
}
