Lecture 11: Exceptions, Iterators, Object Methods

9/21/2020

Lists and Sets in Java

Lists

List61B<Integer> L = new AList<>(); L.addLast(5); L.addLast(10); L.addLast(15); L.print();
java.util.List<Integer> L = new java.util.ArrayList<>(); L.add(5); L.add(10); L.add(15); System.out.println(L);

Lists in Real Java Code

import java.util.List; import java.util.ArrayList; List<Integer> L = new ArrayList<>();

Sets in Java and Python

Set<String> S = new HashSet<>(); S.add("Tokyo"); S.add("Beijing"); S.add("Lagos"); S.add("Sao Paulo"); Sysetme.out.println(S.contains("Tokyo"));

ArraySet

Goals

ArraySet (Basic Implementation)

public class ArraySet<T> { private T[] items; private int size; public ArraySet() { items = (T[]) new Object[100]; size = 0; } public boolean contains(T x) { for (int i = 0; i < size; i += 1) { if (e.equals(items[i])) { return true; } } return false; } public void add(T x) { if (contains(x)) { return; } items[size] = x; size += 1; } public int size() { return size; } }

Exceptions

Exceptions

public class ArraySet<T> { ... public void add(T x) { if (x == null) { throw new IllegalArgumentException("You can't add null to an ArraySet"); } if (contains(x)) { return; } items[size] = x; size += 1; } ... }

Explicit Exceptions

Iteration

The Enhanced For Loop

for (int i : javaset) { System.out.println(i); }

How Iteration Really Works

ArraySet<Integer> = new ArraySet<>(); Iterator<Integer> seer = aset.iterator(); while (seer.hasNext()) { int i = seer.next(); System.out.println(i); }

Support Ugly Iteration in ArraySets

public class ArraySet<T> implements Iterable<T> { ... public Iterator<T> iterator() { return new ArraySetIterator(); } private class ArraySetIterator implements Iterator<T> { private int wizPos; public ArraySetIterator() { wizPos = 0; } public boolean hasNext() { return wizPos < size; } public T next() { T returnItem = items[wizPos]; wizPos += 1; return returnItem; } } }

The Enhanced For Loop

public interface Iterable<T> { Iterator<T> iterator(); } public class ArraySet<T> implements Iterable<T> { ... public Iterator<T> iterator() { return new ArraySetIterator(); } private class ArraySetIterator implements Iterator<T> { private int wizPos; public ArraySetIterator() { wizPos = 0; } public boolean hasNext() { return wizPos < size; } public T next() { T returnItem = items[wizPos]; wizPos += 1; return returnItem; } } }

The Iterable Interface

Iteration Summary

Object Methods: Equals and toString()

Objects

toString()

ArraySet toString

public class ArraySet<T> implements Iterable<T> { ... @Override public String toString() { String returnString = "{"; for (int i = 0; i < size - 1; i += 1) { returnString += item.toString(); return String += ", "; } returnString += items[size - 1]; returnString += "}"; return returnString; } }

ArrayMap toString

public class ArraySet<T> implements Iterable<T> { ... @Override public String toString() { StringBuilder returnSB = new StringBuilder("{"); for (int i = 0; i < size - 1; i += 1) { returnSB.append(items[i].toString()); returnSB.append(", "); } returnS.append(items[size - 1]); returnString.append("}"); return returnSB.toString(); } }

Equals vs. ==

Set<Integer> javaset = Set.of(5, 23, 42); Set<Integer> javaset2 = Set.of(5, 23, 42); System.out.println(javaset == javaset2); // Prints false
Set<Integer> javaset = Set.of(5, 23, 42); Set<Integer> javaset2 = Set.of(5, 23, 42); System.out.println(javaset.equals(javaset2)); // Prints true

The Default Implementation of Equals

public class ArraySet<T> implements Iterable<T> { ... @Override public boolean equals(Object other) { ArraySet<T> o = (ArraySet<T>) other; if (o.size() != this.size()) { return false; } for (T item: this) { if (o.contains(item)) { return false; } } return true; } }
public class ArraySet<T> implements Iterable<T> { ... @Override public boolean equals(Object other) { if (other == null) { return false; } if (other.getClass() != this.getClass()) { return false; } ArraySet<T> o = (ArraySet<T>) other; if (o.size() != this.size()) { return false; } for (T item: this) { if (o.contains(item)) { return false; } } return true; } }
public class ArraySet<T> implements Iterable<T> { ... @Override public boolean equals(Object other) { if (this == other) { return true; } if (other == null) { return false; } if (other.getClass() != this.getClass()) { return false; } ArraySet<T> o = (ArraySet<T>) other; if (o.size() != this.size()) { return false; } for (T item: this) { if (o.contains(item)) { return false; } } return true; } }

Summary

Summary