package cap19.tabellahash;

import java.util.*;

public class TabellaHashList
{ static class Elem
  { private Object key;
    private Object info;
    public Elem(Object k, Object o)
    { key = k;
      info = o;
    }
    public Object getKey()
    { return key;
    }
    public Object getInfo()
    { return info;
    }
    public String toString()
    { return "k=" + key + ", o=" + info;
    }
  }
  private LinkedList[] tab;
  private int hash(Object k)
  { if (k == null)
      return 0;
    return k.hashCode() % tab.length;
  }
  public TabellaHashList(int size)
  { tab = new LinkedList[size];
    for (int i = 0; i < size; i++)
      tab[i] = new LinkedList();
  }
  public int size()
  { int tot = 0;
    for (int i = 0; i < tab.length; i++)
      tot += tab[i].size();
    return tot;
  }
  public void clear()
  { for (int i = 0; i < tab.length; i++)
      tab[i].clear();
  }
  public boolean isEmpty()
  { for (int i = 0; i < tab.length; i++)
      if (!tab[i].isEmpty())
        return false;
    return true;
  }
  public Object find(Object k)
  { int h = hash(k);
    Iterator i = tab[h].iterator();
    while (i.hasNext())
    { Elem e = (Elem) i.next();
      if (e.getKey().equals(k))
        return e.getInfo();
    }
    return null;
  }
  public boolean insert(Object k, Object o)
  { if (o == null)
      throw new InsertException(
        "Inserimento del valore null");
    if (find(k) != null)
      return false;
    int h = hash(k);
    tab[h].add(new Elem(k, o));
    return true;
  }
  public Object extract(Object k)
  { int h = hash(k);
    Iterator i = tab[h].iterator();
    while (i.hasNext())
    { Elem e = (Elem) i.next();
      if (e.getKey().equals(k))
      { Object old = e.getInfo();
        i.remove();
        return old;
      }
    }
    return null;
  }
  public String toString()
  { String s = "";
    for (int i = 0; i < tab.length; i++)
      s += ("[" + i + "]" + tab[i] + 
           System.getProperty("line.separator"));
    return s;
  }
}
