Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Java
You last visited: Today at 05:47

  • Please register to post and access all features, it's quick, easy and FREE!

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.

Reply
 
Old   #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?
QFireball is offline  
Old 07/04/2017, 10:39   #2
Administrator
 
andii's Avatar
 
elite*gold: 25907
The Black Market: 154/0/0
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.
andii is offline  
Old 07/04/2017, 13:13   #3
 
Shadow992's Avatar
 
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:
Shadow992 is offline  
Old 07/04/2017, 19:26   #4



 
Menan's Avatar
 
elite*gold: 0
The Black Market: 169/0/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:
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);
Menan is offline  
Thanks
1 User
Old 07/05/2017, 02:06   #5


 
Moneypulation's Avatar
 
elite*gold: 138
Join Date: Apr 2012
Posts: 3,495
Received Thanks: 1,769
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
Moneypulation is offline  
Thanks
1 User
Old 07/05/2017, 10:22   #6
 
elite*gold: 0
Join Date: Nov 2008
Posts: 227
Received Thanks: 17
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.



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?
QFireball is offline  
Old 07/05/2017, 11:13   #7



 
Menan's Avatar
 
elite*gold: 0
The Black Market: 169/0/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 @
Menan is offline  
Thanks
1 User
Old 07/05/2017, 11:49   #8
 
elite*gold: 0
Join Date: Nov 2008
Posts: 227
Received Thanks: 17
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 @
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.
QFireball is offline  
Old 07/05/2017, 12:27   #9



 
Menan's Avatar
 
elite*gold: 0
The Black Market: 169/0/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:
Menan is offline  
Thanks
1 User
Old 07/05/2017, 13:27   #10


 
dacx's Avatar
 
elite*gold: 558
The Black Market: 296/0/0
Join Date: Jan 2010
Posts: 22,777
Received Thanks: 10,536
#moved (General Coding -> Java)
dacx is offline  
Old 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)

QFireball is offline  
Old 07/05/2017, 13:59   #12



 
Menan's Avatar
 
elite*gold: 0
The Black Market: 169/0/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;
Menan is offline  
Thanks
1 User
Old 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.
QFireball is offline  
Old 07/05/2017, 16:31   #14



 
Menan's Avatar
 
elite*gold: 0
The Black Market: 169/0/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
Menan is offline  
Thanks
1 User
Old 07/05/2017, 17:34   #15
 
elite*gold: 0
Join Date: Nov 2008
Posts: 227
Received Thanks: 17
Quote:
Originally Posted by Menan View Post
@

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
QFireball is offline  
Reply


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.