====== PJV - 3. cvičení - kolekce (dokončení) ======
Metody ''equals(Object)'' (je nutné používat pro Object a ošetřit i "cokoliv jiného") a ''hashCode()'', jsou potřebné, pokud objekty potřebujete v kolekci porovnávat. Tj. hledat, mazat podle obsahu atd. Taky je používají některé kolekce k plnění svých vlastností. Např. //HashSet// v příkladu níže.
Pokud nepřekryjete jednu z těchto metod v třídě //Pes//, množina přestane fungovat a eliminovat duplicity. To proto, že se použije metoda v nadtřídě a tou je //Object//, kde ''equals(Object)'' vrací true jen pro identické objekty a //hashCode()// je pravděpodobně hodnota založená na adrese objektu v paměti. Takže pokud vložíme do množiny více Alíků, budou tam vícekrát, pokud by se jednalo o různé objekty. Zkuste si to na příkladu níže odmazáním těchto metod z třídy //Pes//.
Interface //Comparable// potřebuje objekt implementovat, pokud potřebujeme objekty řadit (viz [[:pjvomo:kolekce|předchozí cvičení]]), nebo pokud je potřebuje kolekce řadit pro plnění své funkce. Např. //TreeSet// je implementována jako vyhledávací strom, kde je prvky stromu nutné porovnávat. Vyzkoušejte si odstranit implementaci //Comparable// z třídy //Pes//. Dále si všimněte, že //TreeSet// je potomkem //SortedSet//, vedlejším efektem je, že se její prvky iterují v seřazeném pořadí.
===== Pes.java =====
package psi;
public class Pes implements Comparable{
    private String jmeno;
    private String majitel;
    public Pes(String jmeno) {
        this(jmeno,"");
    }
    public Pes(String jmeno, String majitel) {
        this.jmeno = jmeno;
        this.majitel = majitel;
    }
    public String vratJmeno(){
        return jmeno;
    }
    @Override
    public String toString(){
        if (majitel.equals("")) return jmeno;
        else return jmeno + "(" + majitel + ")";
    }
    @Override
    public boolean equals(Object o){
        if (o instanceof Pes){
            return (jmeno.equals(((Pes)o).jmeno)) && (majitel.equals(((Pes)o).majitel));
        }
        else{
            return false;
        }
    }
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 71 * hash + (this.jmeno != null ? this.jmeno.hashCode() : 0);
        hash = 71 * hash + (this.majitel != null ? this.majitel.hashCode() : 0);
        return hash;
    }
    public int compareTo(Pes o) {
        int jm = jmeno.compareTo(o.jmeno);
        if (jm == 0){
            return majitel.compareTo(o.majitel);
        } else {
            return jm;
        }
    }
}
===== Main.java =====
package psi;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
public class Main {
    public static void main(String[] args) {
        HashSet set1 = new HashSet();
        set1.add(new Pes("Alik"));
        set1.add(new Pes("Alik"));
        set1.add(new Pes("Alik","Novak"));
        set1.add(new Pes("Alik"));
        set1.add(new Pes("Alik"));
        System.out.println(set1.size());
        for (Iterator it1 = set1.iterator(); it1.hasNext(); ){
            System.out.println(it1.next());
        }
        TreeSet set2 = new TreeSet();
        set2.add(new Pes("Alik"));
        set2.add(new Pes("Alik"));
        set2.add(new Pes("Alik","Novak"));
        set2.add(new Pes("Alik"));
        set2.add(new Pes("Alik"));
        System.out.println(set2.size());
        for (Iterator it2 = set2.iterator(); it2.hasNext(); ){
            System.out.println(it2.next());
        }
    }
}