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