// // // second version, proper hashCode() and equals() method // // import java.util.*; public final class Set2 { private Vector items; private int hashCode = 17; public Set2() { items = new Vector();} public int cardinality() { return items.size(); } public boolean isEmptySet() { return items.isEmpty();} public boolean addItem(Object o) { if (items.indexOf(o) == -1) { items.add(o); hashCode += o.hashCode(); return true; } else return false; } public boolean containsItem(Object o) { return (items.indexOf(o) != -1); } public boolean removeItem(Object o) { int index = items.indexOf(o); if (index == -1) return false; items.remove(index); hashCode -= o.hashCode(); return true; } public int hashCode() { return hashCode;} public boolean equals(Object o) { if (this == o) return true; if (o == null) return false; if (!(o instanceof Set2)) return false; if (hashCode != o.hashCode()) return false; Set2 s = (Set2) o; if (cardinality() != s.cardinality()) return false; for(int i =0; i < items.size(); i++) if (!s.containsItem(items.elementAt(i))) return false; return true; } public static void main(String[] args) { int n = 10; int different = -1; if (args.length >= 1) n = Integer.parseInt(args[0]); if (args.length >= 2) different = Integer.parseInt(args[1]); long time0 = System.currentTimeMillis(); Set2 s0 = makeSet(n); Set2 s1 = makeSet(n); if (different > -1) { s1.removeItem(new Integer(different)); s1.addItem(new Integer(-1)); } long time1 = System.currentTimeMillis(); boolean eq0 = s0.equals(s1); boolean eq1 = s1.equals(s0); long time2 = System.currentTimeMillis(); System.out.println("s0.equals(s1) = " + eq0); System.out.println("s1.equals(s0) = " + eq1); System.out.println("s0.hashCode() = " + s0.hashCode()); System.out.println("s1.hashCode() = " + s1.hashCode()); System.out.println("t0 = " + (time1-time0) + " / t1 = " + (time2-time1)); } public static Set2 makeSet(int max) { Set2 s = new Set2(); for(int i = 0; i