Witam, Jak użyć metody compareTo aby posortować TreeSeta składającego się z obiektów po określonym polu ale aby nie kasowała obiektów które mają tą samą wartość w tym polu ??
0
0
Set zawsze będzie przechowywał unikalne obiekty. Zatem jeżeli dwa z nich mają taką samą wartość pola to jeden poleci. Jedyne rozwiązanie to rozszerzenie warunku sortowania o kolejne pole. Jeżeli nie masz takiego pola to masz problem.
0
tzn mam takie pole :) ale nie wiem jak to zaaplikować do compareTo :(
0
Przykład. Foo posortowane po "id" i w drugiej kolejności po "id2". Należy uważać na przepełnienie.
public class SetTest {
public static int compareInts(int i1, int i2){
if (i1 > i2) return 1;
return i1 < i2 ? -1 : 0;
}
static class Foo implements Comparable<Foo> {
final int id;
final int id2;
public Foo(int id, int id2) {
super();
this.id = id;
this.id2 = id2;
}
@Override
public int compareTo(Foo o) {
int diff = compareInts(id, o.id);
return (diff != 0 ? diff : compareInts(id2, o.id2));
}
@Override
public String toString() {
return new StringBuilder().append("Foo[").append(id).append(",").append(id2)
.append("]").toString();
}
}
public static void main(String[] args) {
TreeSet<Foo> set = new TreeSet<Foo>();
set.add(new Foo(Integer.MAX_VALUE, 1));
set.add(new Foo(Integer.MIN_VALUE, 2));
set.add(new Foo(1, 1));
set.add(new Foo(2, -1));
set.add(new Foo(1, 0));
set.add(new Foo(1, 2));
System.out.println(set);
}
}
Metodę compareTo można też napisać tak:
@Override
public int compareTo(Foo o) {
long diff = ((long) id) - o.id;
if (diff == 0){
diff = ((long) id2) - o.id2;
}
if (diff > 0) return 1;
return diff < 0 ? -1 : 0;
}
Natomiast compareInts tak (ale jest mniej efektywne):
private static int compareInts(int i1, int i2){
return Integer.valueOf(i1).compareTo(i2);
}
0
dzięki :)
Bardzo mi pomogłeś :)