====== 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()); } } }