|
You last visited: Today at 05:47
Advertisement
[Java] Array nach denn 3 größten werden durchsuchen?
Discussion on [Java] Array nach denn 3 größten werden durchsuchen? within the Java forum part of the Coders Den category.
07/04/2017, 10:32
|
#1
|
elite*gold: 0
Join Date: Nov 2008
Posts: 227
Received Thanks: 17
|
[Java] Array nach denn 3 größten werden durchsuchen?
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
|
#2
|
Administrator
elite*gold: 25907
Join Date: Aug 2013
Posts: 9,700
Received Thanks: 2,615
|
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
|
#3
|
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,876
|
Partielles Sortieren ist eine gute Idee:
Falls du zufaellig C++ benutzt:
|
|
|
07/04/2017, 19:26
|
#4
|
elite*gold: 0
Join Date: Sep 2008
Posts: 9,483
Received Thanks: 3,111
|
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.
Falls du ein wirkliches Array hast, sprich eine Variable vom Typ:
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
|
#5
|
elite*gold: 138
Join Date: Apr 2012
Posts: 3,495
Received Thanks: 1,769
|
Quote:
Originally Posted by αи∂ιι
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
|
#6
|
elite*gold: 0
Join Date: Nov 2008
Posts: 227
Received Thanks: 17
|
Quote:
Originally Posted by Menan
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.
Falls du ein wirkliches Array hast, sprich eine Variable vom Typ:
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
|
#7
|
elite*gold: 0
Join Date: Sep 2008
Posts: 9,483
Received Thanks: 3,111
|
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 @
|
|
|
07/05/2017, 11:49
|
#8
|
elite*gold: 0
Join Date: Nov 2008
Posts: 227
Received Thanks: 17
|
Quote:
Originally Posted by Menan
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 @
|
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
|
#9
|
elite*gold: 0
Join Date: Sep 2008
Posts: 9,483
Received Thanks: 3,111
|
@ , 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:
|
|
|
07/05/2017, 13:27
|
#10
|
elite*gold: 558
Join Date: Jan 2010
Posts: 22,777
Received Thanks: 10,536
|
#moved (General Coding -> Java)
|
|
|
07/05/2017, 13:50
|
#11
|
elite*gold: 0
Join Date: Nov 2008
Posts: 227
Received Thanks: 17
|
@ habe das in meinem Code probiert krieger aber eine Fehlermeldung (Bei dir Zeile 48)
|
|
|
07/05/2017, 13:59
|
#12
|
elite*gold: 0
Join Date: Sep 2008
Posts: 9,483
Received Thanks: 3,111
|
@ , ich müsste einmal den gesamten Code sehen noch, so dass die Fehlermeldung nicht die Hälfte davon verdeckt
Edit: eventuell hat deine IDE nicht automatisch den import für Collectors gesetzt.
Code:
import java.util.stream.Collectors;
|
|
|
07/05/2017, 16:27
|
#13
|
elite*gold: 0
Join Date: Nov 2008
Posts: 227
Received Thanks: 17
|
@
Hier ist der Code ielleicht etwas unordentlich :/ aber hoffe ist nicht ganz o schlim für dich
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
|
#14
|
elite*gold: 0
Join Date: Sep 2008
Posts: 9,483
Received Thanks: 3,111
|
@
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
|
|
|
07/05/2017, 17:34
|
#15
|
elite*gold: 0
Join Date: Nov 2008
Posts: 227
Received Thanks: 17
|
Quote:
Originally Posted by Menan
@
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
|
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
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
|
|
|
|
|
Similar Threads
|
Thema nach Benutzer durchsuchen?
08/20/2012 - Main - 4 Replies
Hey Leute,
ich habe ein Thread in der Freebies Section auf und wollte fragen ob es möglich ist anzuzeigen zu lassen ob jemand in meinem Thread mehrfach gepostet hat. Ich hab keine Lust alles von Hand nachgucken, ich hab so'ein Verdacht das jemand mehrfach gepostet hat (was ich bei mir verboten hab da es eine verlosung ist)
|
Welche sind die Größten sind die größten noob waffen?
09/19/2011 - S4 League - 17 Replies
Welche sind die größten noob waffen?
|
Internetseite nach Wort durchsuchen
01/15/2011 - AutoIt - 1 Replies
Hallo, ich möchte ein Programm erstellen, mit dem ich bei facebook automatisch poken(anstupsen) kann. Ich hab das jetzt mit Pixelsearch gemacht, dass wenn es an der einen stelle so blau ist, zuerst auf das poke und dann auf diesen knopf poke gedrückt wird. Fuktioniert aber wenn jemand Geburtstag hat und das ein bisschen weiter unten steht nicht , oder wenn ich auf eine andere Seite geh, drückt er dort auf diesen link der dort steht.
Meine Frage, ist es möglich, die Internetseite nach "Poke...
|
[PHP] Array pushen und durchsuchen
01/03/2011 - Web Development - 4 Replies
Ich habe folgendes Problem:
ich möchte jede Zeile einer Textdatei in ein Array pushen und dieses danach nach einem Bestimmten Eintrag durchsuchen.
Folgender Code:
<?php
$hallo = array();
$test = $_GET;
$datei = fopen("test.txt","r");
while (!feof($datei))
{
|
Datenbank nach Sachen schneller durchsuchen?
07/16/2010 - Metin2 Private Server - 8 Replies
Hey Com,
da ich in der SuFu nichts darüber gefunden habe, wollte ich meine Frage einfach mal in einem Thread fragen.
Ich möchte in der Datenbank ein Item finden, welches ich in meinem Inventar habe. Da es aber über 1800 Seiten sind, wollte ich Euch fragen, ob es einen schnelleren Weg gibt, diese eine Sache zu finden.
Ich bedanke mich im Vorraus.
Bitte kein Flame/ Spam. Danke.
|
All times are GMT +2. The time now is 05:47.
|
|