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 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<Pes>{ 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<Pes> set1 = new HashSet<Pes>(); 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<Pes> set2 = new TreeSet<Pes>(); 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()); } } }