[Java] Array nach denn 3 größten werden durchsuchen?

07/04/2017 10:32 QFireball#1
hey wie kann ich in java ein Array nach denn drei größten Werten durchsuchen?

Denn Gröten würde ich ja so bekommen:

for (int i = 1; i < array.length; i++) {
if (array.get(i) > max) {
max = array.get(i);
}

wie kriege ich aber die nächsten 2?
07/04/2017 10:39 andii#2
Gib dem größten Wert eine Variable
Frag dann ab if i == max, also ob dieser Wert bereits exisitert
Wenn ja soll er einfach weiter suchen und den nächsten Wert nehmen.
07/04/2017 13:13 Shadow992#3
Partielles Sortieren ist eine gute Idee:

[Only registered and activated users can see links. Click Here To Register...]

Falls du zufaellig C++ benutzt:
[Only registered and activated users can see links. Click Here To Register...]
07/04/2017 19:26 Menan#4
Ich nehme an, dein Array ist kein wirkliches Array, sondern eine Arrayliste (da du ja die get-Methode benutzt).

Arraylisten zu sortieren geht in Java am besten mit einem Stream (seit Java 8 verfügbar):

Code:
List<Integer> sortedList = list.stream().sorted((n1,n2) -> Integer.compare(n1, n2)).collect(Collectors.toList());
Dann hast du eine nach der Größe sortierten Liste.

[Only registered and activated users can see links. Click Here To Register...]

Falls du ein wirkliches Array hast, sprich eine Variable vom Typ:
Code:
int[]
Kannst du daraus mit:
Code:
Arrays.asList(array);
eine Arrayliste daraus machen, auf der du Stream Operationen ausführen kannst.

Deine drei größten Werte findest du folglich mit:
Code:
Größter Wert: sortedList.get(sortedList.size() - 1);
zweit größter Wert: sortedList.get(sortedList.size() - 2);
dritt größter Wert: sortedList.get(sortedList.size() - 3);
07/05/2017 02:06 Moneypulation#5
Quote:
Originally Posted by αи∂ιι View Post
Gib dem größten Wert eine Variable
Frag dann ab if i == max, also ob dieser Wert bereits exisitert
Wenn ja soll er einfach weiter suchen und den nächsten Wert nehmen.
Das würde schief gehen, sobald die größte zahl mehrfach in der arraylist drin ist.


Mal abgesehen von den fortgeschritteneren antworten, hätte ich noch eine einfache Lösung für dich. Schließlich kann ich mir bei der einfachen problemstellung kaum vorstellen, dass etwas auf den niveau erwartet wird. Dein Grundkonzept mit dem Durchlauf der ganzen arrayliste passt ja eigentlich. Du brauchst neben max aber noch 2 weitere variablen. Dann änderst du die if abfrage so ab, dass du ein mal nach dem größten wert abfragst, falls die Bedingung nicht zutrifft nach dem 2. Größten und dann nach dem 3. Größten. Wenn du jetzt einen neuen max wert hast, kannst du den ja nicht einfach überschreiben, sondern musst den alten wert quasi nach hinten aufrücken, sodass dein alter max wert der neue 2. Größte wert ist und der alte 2. Größte der neue 3. Größte
07/05/2017 10:22 QFireball#6
Quote:
Originally Posted by Menan View Post
Ich nehme an, dein Array ist kein wirkliches Array, sondern eine Arrayliste (da du ja die get-Methode benutzt).

Arraylisten zu sortieren geht in Java am besten mit einem Stream (seit Java 8 verfügbar):

Code:
List<Integer> sortedList = list.stream().sorted((n1,n2) -> Integer.compare(n1, n2)).collect(Collectors.toList());
Dann hast du eine nach der Größe sortierten Liste.

[Only registered and activated users can see links. Click Here To Register...]

Falls du ein wirkliches Array hast, sprich eine Variable vom Typ:
Code:
int[]
Kannst du daraus mit:
Code:
Arrays.asList(array);
eine Arrayliste daraus machen, auf der du Stream Operationen ausführen kannst.

Deine drei größten Werte findest du folglich mit:
Code:
Größter Wert: sortedList.get(sortedList.size() - 1);
zweit größter Wert: sortedList.get(sortedList.size() - 2);
dritt größter Wert: sortedList.get(sortedList.size() - 3);
Diese Lösug gäfellt mir eigentlich am besten nur kann ich die so leider nicht umsetzten bzw. vlt kannst du mir da helfen.
Das Problem ist halt das die Liste bzw. die Positionen mit einer aneren Array Liste zusammenhängen. Also ich habe eine Arrayliste mit Strings und dann diese mit Zahlen wo ich die 3 größten von Brauche.Und der String in Position 5 zb. gehört zur Zahl in position 5 und so weiter.

Wenn ich ja jetzt aber eine Liste sortierer sind ja die Positionen Vertauscht gibt es da ne Lösung?
07/05/2017 11:13 Menan#7
Du könntest eine TreeMap verwenden, welche Integer auf String mapped. Das tolle an einer TreeMap ist, dass die Key Elemente darin automatisch sortiert werden, direkt beim Erstellen davon :)

Dann besorgst du dir das EntrySet der Map, welches ein Set<Entry> ist und kannst auf die letzten 3 Einträge davon zugreifen.

Ich hoffe das ist so verständlich für dich, sonst gib mir kurz ne Rückmeldung, dann schreib ich schnell bisschen code zusammen :) @[Only registered and activated users can see links. Click Here To Register...]
07/05/2017 11:49 QFireball#8
Quote:
Originally Posted by Menan View Post
Du könntest eine TreeMap verwenden, welche Integer auf String mapped. Das tolle an einer TreeMap ist, dass die Key Elemente darin automatisch sortiert werden, direkt beim Erstellen davon :)

Dann besorgst du dir das EntrySet der Map, welches ein Set<Entry> ist und kannst auf die letzten 3 Einträge davon zugreifen.

Ich hoffe das ist so verständlich für dich, sonst gib mir kurz ne Rückmeldung, dann schreib ich schnell bisschen code zusammen :) @[Only registered and activated users can see links. Click Here To Register...]
Oh das klingt für eine Perfekt Lösung dafür. Müsste mir es aber erstmal genau angucken da ich die Funktion so noch garnicht kenne.

Edit:Ok habs mir mal angeguckt glaube das geht doch nicht dafür???? Ich erkläre mall was genau ich mache:
Ich habe eine String Arraylist die Schon alphabetisch sortiert ist. Diese durchsuche ich mittelst Binärer Suche mit einem Prefix. Und aus dem was dann gesucht wurde, sollen mir die 3 mit der Höchsten gewichtung angezigt werden. Wird dann von denn 3 eins vom Benutzer ausgewählt soll für denn String die Gewichtung ein hochgezählt werden.
07/05/2017 12:27 Menan#9
@[Only registered and activated users can see links. Click Here To Register...], da ist die Treemap wohl doch der falsche Ansatz dann.

Allerdings solltest du hierfür auf jeden Fall ne Map verwenden, allerdings eine Map<String,Integer>, da du ja dem String einen Wert zuweißen möchtest..
Dann kannst du in der Map deine relevanten Strings raussuchen und diese nach ihrem zugeordneten Wert sortieren und dann den Wert eins hochzählen.

Zwei im Grunde unabhängige Arraylisten hierfür zu verwenden, wenn Werte zugeordnet werden ist nicht gut, denn dafür gibts die Map.

Edit: Du erstellst dir die Map und durchsuchst dann das EntrySet (Set<Entry>) nach den entsprechenden Werten im Key (String) und sortierst die Liste der gefunden Entrys dann nach dem entry.Value (Integer). Das ganze kann man im Grunde auch ganz toll mit nem Stream lösen!

Edit2: Hier nen bisschen Source:
[Only registered and activated users can see links. Click Here To Register...]
07/05/2017 13:27 dacx#10
#moved (General Coding -> Java)
07/05/2017 13:50 QFireball#11
@[Only registered and activated users can see links. Click Here To Register...] habe das in meinem Code probiert krieger aber eine Fehlermeldung (Bei dir Zeile 48)

[Only registered and activated users can see links. Click Here To Register...]
07/05/2017 13:59 Menan#12
@[Only registered and activated users can see links. Click Here To Register...], ich müsste einmal den gesamten Code sehen noch, so dass die Fehlermeldung nicht die Hälfte davon verdeckt :D

Edit: eventuell hat deine IDE nicht automatisch den import für Collectors gesetzt.
Code:
import java.util.stream.Collectors;
07/05/2017 16:27 QFireball#13
@[Only registered and activated users can see links. Click Here To Register...]
Hier ist der Code ielleicht etwas unordentlich :/ aber hoffe ist nicht ganz o schlim für dich
[Only registered and activated users can see links. Click Here To Register...]

Zeile 100 Initzilisiere ich denn treemap und in Zeile 805 ist die Methode wo ich deinen Code auch benutzen will.
07/05/2017 16:31 Menan#14
@[Only registered and activated users can see links. Click Here To Register...]

Zeile 806:
Code:
.filter(.getKey().startsWith(prefixlow))

ändern zu:
.filter(e -> e.getKey().startsWith(prefixlow))
Du solltest dringend deinen Code in verschiedene Klassen packen um mehr Übersichtlichkeit zu gewährleisten (du tust dir selbst damit auch nen gefallen :P)!
Hätte garnicht den gesamten Code gebraucht, die Methode hätte es auch getan bzw einfach das Bild ohne die Error-Message :D
07/05/2017 17:34 QFireball#15
Quote:
Originally Posted by Menan View Post
@[Only registered and activated users can see links. Click Here To Register...]

Zeile 806:
Code:
.filter(.getKey().startsWith(prefixlow))

ändern zu:
.filter(e -> e.getKey().startsWith(prefixlow))
Du solltest dringend deinen Code in verschiedene Klassen packen um mehr Übersichtlichkeit zu gewährleisten (du tust dir selbst damit auch nen gefallen :P)!
Hätte garnicht den gesamten Code gebraucht, die Methode hätte es auch getan bzw einfach das Bild ohne die Error-Message :D
Ja ich weiß habe das Projekt von nem anderen Studenten übernommen und da schon so einiges in neue Methoden und Klassen gepackt leider imemr noch sehr unordentlich

Daran alleine liegt es noch nicht und mir ist aufgefallen je nachdem wo ich denn tremap initzialisiere kommt ein anderer fehler :confused:
mach ich das in der Methode kommt der Fehler denn ich als Bild geposted habe in der Klasse kommt:
cant find symbol
symbol: method getkey()
location: variable e of type object

und für getvalue auch