4 Höchste Werte aus Array auslesen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    4 Höchste Werte aus Array auslesen

    Hallo Leute ich habe folgendes Problem an dem ich jetzt schon einige Tage hänge...
    Ich habe 2 Arrays, welche einmal den Namen und den "Angriff" beinhalten. Diese werden immer zusammenhängend beschrieben. Nun möchte ich die 4 "Helden", welche den höchsten Angriff haben in eine Listbox schreiben.
    Habe schon ein paar unterschiedliche Ergebnisse erzielt, jedoch nie das richtige. Offensichtlich sonst würde ich nicht hier fragen :D
    In der Aktuellen Version werden zwar 4 Werte in die Listbox geschrieben, jedoch ist es immer der gleiche -.-
    In einer anderen Hatte ich zwar 3! werte in der LB, wo von auch 2 gepasst haben aber der 3. kompletter Bullshit war, bzw ja sowie so noch einer gefehlt hat.

    Deswegen meine Frage, wie bekomme ich das hin, das es passt. Hier mal was ich bisher habe:

    Visual Basic-Quellcode

    1. Sub Maxwert()
    2. Dim strName, strHedenLB As String
    3. Dim iANG, iHP, iDEF, iZaehler, iZaehler2 As Integer
    4. iZaehler2 = 0
    5. Do
    6. For x As Integer = 0 To araHName.Length - 1
    7. If iANG < araAngriff(x) Then
    8. If LBTeamBuilder.Items.Count = 0 Then
    9. iANG = araAngriff(x)
    10. strName = araHName(x)
    11. End If
    12. If iZaehler2 <> 0 Then
    13. For z As Integer = 0 To iZaehler2
    14. strHedenLB = LBTeamBuilder.Items.Item(z).ToString
    15. If strHedenLB.Contains(strName) Then
    16. Else
    17. iANG = araAngriff(x)
    18. strName = araHName(x)
    19. End If
    20. Next
    21. End If
    22. End If
    23. Next
    24. LBTeamBuilder.Items.Add("Name :" & strName & " Angriff: " & iANG)
    25. iZaehler2 = LBTeamBuilder.Items.Count
    26. iZaehler += 1
    27. Loop Until iZaehler = 4
    28. End Sub


    Schon mal vielen Dank für eure Hilfe.
    Toolknight
    @Toolknight Sortiere die Werte des Arrays der Größe nach (Array,Sort()) und lies die ersten oder letzten (je nach dem) Werte aus.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn ich das so mache bekomme ich zwar die Werte sortiert, aber dann habe ja die Namen nicht mehr am passenden Index für die jeweiligen werte.
    Gibt es eine Möglichkeit die Reihenfolge der Werte auch auf den Array mit den Namen zu übertragen?

    Vollzitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Array.Sort hat eine Überladung, mit der man zwei "verbundene" Arrays sortiert.
    Also das eine Array wird sortiert, und die Elemente des anderen werden mit umgeräumt.

    Schreib am besten eine vom Namen und ihren Argumenten her sinnvolle Methode.
    Maxwert() als MethodenName ergibt überhaupt keinen Sinn.
    Denk dir eine Methode aus, der man etwas übergibt (meinetwegen die beiden Arrays), und die dafür etwas zurückgibt (etwa ein Array der 4 grössten Helden).
    Erst wenn man so einen Rumpf hat, kann man anfangen, einen Algorithmus zu entwickeln, der tut, wasser soll.
    @Toolknight Wenn die beiden Arrays gekoppelt sind, mach da ein Dictionary(Of T1, T2) draus oder ne List(Of Tuple(T1, T2)), da wäre die Koppelung inhärent.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany ich schätze deine Beiträge wirklich sehr. Aber du nutzt manchmal Wörter da muss ich Frau Google um Erläuterung bitten. X/ Hier inhärent. Nimm das bitte nicht böse, so ist es absolut nicht gemeint.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Nimm das bitte nicht böse
    Nö, nehme ich nicht, ich werde es als Anregung nehmen.
    Allerdings gibt es Begriffe, da müsste man im Deutschen einen ganzen Satz schreiben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was spreche dagegen ein zweidimensionales Array zu nutzen, welches du dann nach der Keyval sortierst und dann die Namen der 4 größten Werte ausgibst?
    Dann könntest du ein standardisiertes Sortierverfahren nutzen und hast den ganzen "Stress" nicht, den du dir da aktuell machst.
    Wäre nur mal eine Idee, versuche dein Problem zu verstehen :)
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    @ErfinderDesRades Ich habe jetzt folgende Funktion geschrieben und diese Funktioniert auch wie Sie soll.

    Hat da jemand noch verbesserungsvorschläge?

    VB.NET-Quellcode

    1. Function Sortierung_Array(ByVal araOne As String(), ByRef araTwo As Integer(), ByVal strWert As String) As String()
    2. Dim strTeilArray As String
    3. Dim araName() As String
    4. Dim araWert() As Integer
    5. araName = CType(araOne.Clone(), String())
    6. araWert = CType(araTwo.Clone(), Integer())
    7. Dim araRückgabe(3) As String
    8. Dim intArraylengt As Integer
    9. Array.Sort(araWert, araName)
    10. intArraylengt = araTwo.Length - 1
    11. For x As Integer = 0 To 3
    12. strTeilArray = "Held " & x + 1 & ": " & araName(intArraylengt - x) & " mit " & araWert(intArraylengt - x) & strWert
    13. araRückgabe(x) = strTeilArray
    14. Next
    15. Return araRückgabe
    16. End Function


    @SystemException Das Problem was ich mit den 2 Dimensionalen Array hauptsächlich hatte waren die Unterschiedlichen Datentypen. Ich weiß mit der ein oder anderen Konvertierung wäre das gegangen. Aber ich muss zugeben, das Arrays mein Todfeind sind. (Genauso wie SQL :D) Deswegen versuche ich mich derzeit nach und nach in die Materie einzuarbeiten :D
    Jo - so meinte ich das - verbessern kann man natürlich immer:

    VB.NET-Quellcode

    1. ''' <summary>erzeugt Beschreibungs-Texte für die 4 Helden mit den hoechsten Werten</summary>
    2. Private Shared Function GetTop4(ByVal helden As String(), ByVal werte As Integer(), ByVal postfix As String) As String()
    3. Dim araName = CType(helden.Clone(), String())
    4. Dim araWert = CType(werte.Clone(), Integer())
    5. Dim araRueck(3) As String
    6. Array.Sort(araWert, araName)
    7. Dim intArraylengt = werte.Length - 1
    8. For x As Integer = 0 To 3
    9. araRueck(x) = "Held " & x + 1 & ": " & araName(intArraylengt - x) & " mit " & araWert(intArraylengt - x) & postfix
    10. Next
    11. Return araRueck
    12. End Function

    Hinweise:
    ByRef nur wenn notwendig verwenden
    Wenn nicht notwendig ByRef nicht verwenden.
    Sinnvoll benamen. Was durch Benamung sich nicht erklärt durch Kommentation erklären.
    Benamung nochmal:
    keine Umlaute in Code.
    'Sortierung_Array' ganz falsch, weil die Methode sortiert doch nix, jedenfalls nicht nach aussen sichtbar.
    araOne, araTwo, strWert: gänzlich nichtssagend. 'postFix' ist auch nicht dolle, aber da ahnt man schoma, dass das angehängt wird.
    Bei Benamung ist viel viel wichtiger, auszusagen, was es dartellen soll, als was es für ein Datentyp ist. Weil der Datentyp steht ja eh direkt dahinter, das muss inne Benamung nicht extra erwähnt werden.
    Also dass helden ein Array ist sieht man doch (wenn einem die vb-Grundlagen bekannt sind).
    Aber dasses die Helden sind, von denen die 4 besten auszusuchen sind - das erschliesst sich nur, wenn man die Helden auch als 'helden' bezeichnet.

    Scope: So klein wie möglich, also Private
    Shared: Die Methode ist 'autark' - also sie benötigt nichts weiter aus der umgebenden Klasse, als ganau das, was sie als Parameter übergeben bekommt.
    Das ist immer besser so. Dann kann man sie auch Shared deklarieren - wodurch verhindert wird, dass nachträglich noch Klassen-Abhängigkeiten eingebaut werden. Ausserdem ist ihre "architektonische Reinheit" so auch gleich dokumentiert.
    Wie gesagt - wenn sowas möglich ist, ists besser. Ich konnte die Methode bei mir irgendwo einkopieren und hatte keinen Compile-Fehler, was die Überarbeitung sehr erleichtert.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Theiss ist nixgutt.
    Theiss führt Strict-Off-Programmierung vor, und benutzt Vb6-Methoden, und ungenerische Uralt-Klassen usw. Den nicht.
    Ich empfehle immer Kühnel/Leibhard oder - Löffelmann.
    Siehe auch Entwickler-Ressourcen und Tools, Bücher und WebCasts
    Ach - zum Lernen habich mir ja auch selbst ein Selbst-Studium-Programm ausgedacht: Datenverarbeitungs-Vorraussetzungen
    Also da lege ich Wert auch darauf, Grundlagen und Programmier-Instrumentarium schnell kennenzulernen, als Vorraussetzung für weiteres, problemorientiertes Lernen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()