Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich frage mich, wie geht das, die primitiven int Werte eigener Klasse in einer Liste zu sortieren.
Mit toString(); werden sie zu Strings, aber wie gehts weiter mit Sortierung?
Mit compareTo(); bekomme ich den Fehler, dass es mit primitiven int Werten nicht funktioniert.
Vielen Dank für die Tipps!
Code:
public class ZahlenMain {
public static void main(String[] args) {
List<Zahlen> list = new ArrayList<Zahlen>();
Zahlen.eingabe(3, list);
Zahlen.ausgabe(list);
}
}
Code:
public class Zahlen {
private int lotto;
Zahlen(int lotto) {
this.lotto = lotto;
}
@Override
public String toString() {
return "" + lotto;
}
//@Override
public int compareTo(Zahlen o) {
return lotto.compareTo(o.lotto);
}
public static void eingabe(int zahlen, Collection<Zahlen> collection) {
System.out.println("3 Zahlen...");
for (int i = 1; i <= zahlen; i++) {
Scanner scanner = new Scanner(System.in);
int eingabe = scanner.nextInt();
Zahlen zahl = new Zahlen(eingabe);
collection.add(zahl);
}
}
public static void ausgabe(Collection<Zahlen> collection) {
for (Zahlen zahl : collection) {
System.out.println(zahl);
}
}
}
Ich hab gelesen, dass wenn man Objekte eigener Klasse sortieren will, soll man compareTo() und keine Collections.sort() nutzen.
Dabei war ein Beispiel, allerdings nicht mit primitivem int, sondern mit String (private String name). Es hat auch gut geklappt.
Ist es so, dass man bei primitiven Werten beides nehmen muss, compareTo und Collections.sort ?
ja (es sollte sogar immer beides verwendet werden)
theoretisch wäre hier ein pitfall: return i0-i1;
wenn i1 sehr groß und i0 sehr klein ist kommt es zu einem Unterlauf, also würde fälschlicherweise ein Wert >0 zurückgegeben werden.
und um das if-else Geraffel zu vermeiden, nimmt man die bereits vorhandene Implementierung von compareTo.
Da kann man Collections.sort nicht nutzen. Sortiert wird das Set in diesem Beispiel nicht:
Code:
public class ZahlenSetMain {
public static void main(String[] args) {
Set<ZahlenSet> set = new HashSet<ZahlenSet>();
set.add(ZahlenSet.addNummer(28));
set.add(ZahlenSet.addNummer(35));
set.add(ZahlenSet.addNummer(15));
set.add(ZahlenSet.addNummer(10));
set.add(ZahlenSet.addNummer(28));
ZahlenSet.ausgabe(set);
}
}
Code:
public class ZahlenSet implements Comparable<ZahlenSet> {
private int nummer;
public ZahlenSet(int nummer) {
this.nummer = nummer;
}
@Override
public String toString() {
return "" + nummer;
}
@Override
public int compareTo(ZahlenSet o) {
return Integer.valueOf(nummer).compareTo(o.nummer);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + nummer;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ZahlenSet other = (ZahlenSet) obj;
if (nummer != other.nummer)
return false;
return true;
}
public static ZahlenSet addNummer(int nummer) {
return new ZahlenSet(nummer);
}
public static void ausgabe(Collection<ZahlenSet> collection) {
for (ZahlenSet zahlenSet : collection) {
System.out.println(zahlenSet);
}
}
}