int compareTo(T that)
// used as e1.compareTo(e2)
String
chceme jména od K po MComparable<T>
int compareTo(T o)
T
= typ objektu, název třídycompareTo
int compareTo(T that)
// used as e1.compareTo(e2)
this
(e1) a that
(e2)vrací celé číslo, pro které platí:
Comparable<E>
public class Point implements Comparable<Point> {
private int x;
// ascending order
public int compareTo(Point that) {
return this.x - that.x;
}
}
...
new Point(1).compareTo(new Point(4)); // -3
Existuje i beztypové rozhraní Comparable , to ale nebudeme používat!
|
compareTo
vs. equals
compareTo
by mělo být konzistentní s equals
compareTo
mělo vrátit 0
není to však nutnost
BigDecimal
pro přesné hodnoty podmínku porušujecompareTo
na rozdíl od equals
nemusí vstupní objekt přetypovávat a může vyhazovat výjimkuCo kdybychom chtěli více typů uspořádání, nebo alternativu k přirozenému uspořádání?
Nemůžeme nadefinovat stejnou metodu víckrát.
int compare(T o1, T o2)
T
compare
funguje stejně jako u compareTo
Třída String
má definované přirozené uspořádání lexikograficky.
Definujme lexikografický komparátor, který ignoruje velikost písmen:
public class IgnoreCaseComparator implements Comparator<String> {
public int compare(String o1, String o2) {
return o1.toLowerCase().compareTo(o2.toLowerCase());
}
}
...
new IgnoreCaseComparator().compare("HI", "hi"); // 0
Budeme se zabývat rozhraními SortedSet
a SortedMap
.
SortedSet, SortedMap
SortedSet
Comparable
(nebo použít komparátor)TreeSet
SortedMap
Comparable
(nebo použít komparátor)TreeMap
TreeSet
TreeSet()
TreeSet(Collection<? extends E> c)
c
TreeSet(Comparator<? super E> comparator)
TreeSet(SortedSet<E> s)
s
TreeSet
IDefinice přirozeného uspořádání:
public class Point implements Comparable<Point> {
...
public int compareTo(Point that) {
return this.x - that.x;
}
}
TreeSet
IIPoužití:
SortedSet<Point> set = new TreeSet<>();
set.add(new Point(3));
set.add(new Point(3));
set.add(new Point(-1));
set.add(new Point(0));
System.out.println(set);
// prints -1, 0, 3
TreeSet
Třída String
má definované přirozené uspořádání lexikograficky.
SortedSet<String> set = new TreeSet<>();
set.add("Bobik");
set.add("ALIK");
set.add("Alik");
System.out.println(set); // [ALIK, Alik, Bobik]
SortedSet<String> set2 = new TreeSet<>(new IgnoreCaseComparator());
set2.addAll(set);
System.out.println(set2); // [ALIK, Bobik]
TreeSet pro porovnávání prvků používá compareTo / compare ,
proto má druhá množina pouze 2 prvky!
|
TreeSet
pod lupouimplementována jako červeno-černý vyvážený vyhledávací strom
add, remove, contains
jsou v O(log n)hodnoty jsou uspořádané
TreeMap
TreeSet
TreeMap
Klíče jsou unikátní a uspořádané, hodnoty nikoliv.
SortedMap<String, Integer> population = new TreeMap<>();
population.put("Brno", -1);
population.put("Brno", 500_000);
population.put("Bratislava", 500_000);
System.out.println(population);
// {Bratislava=500000, Brno=500000}
/