ich habe eine Frage zu Iteratoren, und zwar möchte ich aus einem Set mit Zahlenwerten den kleinsten Zahlenwert speichern.
Mein Problem ist nun, dass in einer Menge ja keine feste Reihenfolge existiert und ich zwar den Iterator alle Elemente durchlaufen lassen kann, ich aber einen ersten Vergleichswert brauche.
In ner normalen Zählschleife z.B. würde ich einfach den ersten Wert (etwa den eines Arrays als ersten Vergleichswert setzen, und dann alle weiteren mit diesem Wert vergleichen und jeden, der kleiner ist, an Stelle des Vergleichswertes setzen.
Wie aber mache ich das über einen Iterator einer Menge? Oder gibt es Alternativen?
Danke schon jetzt für jeden Tipp!
Liebe Grüße
Pandora
Am einfachsten ist es wohl, einen sehr hohen Startwert zu setzen, der nicht vorkommen kann, falls ein solcher bekannt ist. Ansonsten könnte man den Startwert auch innerhalb der Schleife setzen und mit einem boolean steuern, ob er schon gesetzt wurde oder nicht.
Das mit dem hohen Startwert klingt gut, das versuch ich gleich mal.....der andere Vorschlag ist für mich momentan noch zu kompliziert,nachdenken werd ich auch mal darüber. Danke jedenfalls für beides!Du hast mir sehr geholfen!
In der Mathematik nicht, in Java schon: TreeSets sind immer geordnet. Du kannst also folgendes machen:
Java:
Set<Integer> set =newTreeSet<Integer>();//füge viele Zahlen hinzuint kleinsteZahl = set.iterator.next()//oder:for(int i : set){//zahlen in aufsteigender Ordnung}
SortedSet<Integer> set =newTreeSet<Integer>();// Zahlen, Zahlen und noch mehr Zahlen einfügenint minimum = set.first();
?
JavaDoc hat gesagt.:
E first()
Returns the first (lowest) element currently in this set.
Returns: the first (lowest) element currently in this set
Throws: NoSuchElementException - if this set is empty
Die Lösung mit Collections.min funktioniert. Die Lösungen mit TreeSet/SortedSet funktionieren nur bedingt, da sie etwas voraussetzen, was nicht unbedingt gegeben ist: ein Set ist ja kein SortedSet.
Die Schwierigkeit ist, dass ich nicht einfach ein Set mit Zahlen habe, sondern mit Objekten, die in ihren Klassen Objektvariablen deklariert bekommen haben, ich muss also die Zahlenwerte der Objekte abrufen. Ein einfaches Collections.min(menge) dürfte da wohl nicht reichen.
Ist es denn jetzt überhaupt möglich, eine unsortierte Menge durchzulaufen, ohne Iterator? Weil Ark ja von einem "Gerücht" gesprochen hat.....wie löse ich das denn elegant? Ich muss ja noch einen Downcast machen, wenn ich den "String" aus der Menge erst in das Objekt und dann in den Wert des Objektes invertieren muss?
Die Aussage von Ark ist imho nur allgemeiner Art und sollte keine Rückschlüsse für das Durchlaufen eines Sets nahelegen. Ein Set kann man afaik nur mit Iterator durchlaufen. Aber wieso sprichst du eigentlich zuerst von einem Set mit Objekten und dann von dem "String" aus der Menge ???:L
Zwar fast nicht mehr aktuell, aber der Vollständigkeit halber:
Von dem String hab ich gesprochen, weil ich es so verstanden hatte, dass Objekte in einer Menge zunächst als String gespeichert werden. Möchte man den int-Wert eines Objektes in der Menge, ist doch dann der Downcast mit (Integer) notwendig, oder lieg ich da falsch?
Nein. Die "Menge" ist von einem bestimmten Typ, und von diesem Typ müssen auch alle Elemente in der Menge sein.
Wenn du als Typ Integer nimmst, kannst du Integer reintun und bekommst auch wieder Integer heraus. Nix mir casten. (außer du benutzt die Collection-Klassen ohne Generics, dann bekommst du immer jeweils ein Object zurück und musst diese casten...)