Gleiche Einträge in einem Array löschen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Gleiche Einträge in einem Array löschen

    Hallo,
    ich habe ein Array mit vielen Einträggen. Jedoch kommen dort sehr viele doppelt vor. Wie kann ich diese dupletten löschen, dass von jedem Eintrag nur noch einer da ist und bei

    VB.NET-Quellcode

    1. UBound
    dann auch keine doppelten Einträge mitgezählt werden?

    Bsp:

    VB.NET-Quellcode

    1. Dim Array As Object = 'mein Array
    2. 'Der Array entält:
    3. 'Peter
    4. 'Margot
    5. 'Peter
    6. 'Susanne
    7. 'Susanne
    8. Ubound(Array) 'Ergebnis: 5


    Danach:

    VB.NET-Quellcode

    1. Dim Array As Object = 'mein Array
    2. 'Der Array entält:
    3. 'Peter
    4. 'Margot
    5. 'Susanne
    6. Ubound(Array) 'Ergebnis: 3


    Wie könnte man so etwas realisieren?

    Peter
    Ich würde dazu das ganze Aufsteigend sortieren. Dadurch würden alle gleichen Einträge direkt nebeneinander stehen und man kann sehr schnell erkennen ob man einen Eintrag behalten kann oder ob er im vorherigen Eintrag bereits vor kam.

    peterf1 schrieb:

    Könntest du mir mal ein Beispiel geben??

    Ich hab sowas in einem meiner Programme verbaut (da gings um das löschen von doppelten Dateien). Bin nur leider grad am falschen PC (lappi im Garten in der Sonne :D ). Werds dann posten sobald ichs gefunden hab.

    Edit:
    Ok, habs gefunden:

    VB.NET-Quellcode

    1. Dim artext(5) As String
    2. Dim übereinstimmung(UBound(artext)) As Integer
    3. Dim anzahldoppelte As Integer
    4. artext(0) = "1"
    5. artext(1) = "1"
    6. artext(2) = "2"
    7. artext(3) = "1"
    8. artext(4) = "0"
    9. artext(5) = "2"
    10. For i = 0 To UBound(artext)
    11. If übereinstimmung(i) <> 1 Then
    12. For a = 0 To UBound(artext)
    13. If a <> i Then
    14. If artext(a) = artext(i) Then
    15. übereinstimmung(a) = 1
    16. anzahldoppelte += 1
    17. End If
    18. End If
    19. Next
    20. End If
    21. Next
    22. MsgBox(anzahldoppelte.ToString)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „magerquark“ ()

    VB.NET-Quellcode

    1. If übereinstimmung(i) <> 1 Then

    Diese Zeile fragt ab, ob der Wert des Arrays übereinstimmung bei einem index von "i",nicht "1" ist. Wenn ja führt er den Code der danach kommt aus.

    VB.NET-Quellcode

    1. If artext(a) = artext(i) Then

    Diese Zeile überprüft, ob der Wert des Arrays artext bei einem index von "a" dem des Array artext bei einem index von "i" entspricht. Sprich: Es wird geschaut, ob es das gleiche ist. Wenn ja, wird folgende Zeile ausgeführt:

    VB.NET-Quellcode

    1. übereinstimmung(a) = 1

    Diese Zeile setzt den Wert des Arrays übereinstimmung beim Index "a" auf 1. Dies wird benötigt, um nacher beim nächsten Durchlauf der Schleife schauen zu können, ob die Übereinstimmung nicht Schon gezählt wurde. Ohne diese, und die erste Zeile dieses Posts wurde man bei diesem Beispiel:

    VB.NET-Quellcode

    1. artext(0) = "Hans"
    2. artext(1) = "Peter"
    3. artext(2) = "Hans"

    darauf kommen dass es 2 doppelte Einträge gibt, da

    VB.NET-Quellcode

    1. artext(0) = artext(2)
    2. artext(2) = artext(0)

    Tatsächlich gibt es aber nur einen doppelten Eintrag (Wobei dies natürlich auf Definition und Sichtweise ankommt).
    @magerquark: Das geht auch einfacher meine ich...
    ...und zwar so:

    VB.NET-Quellcode

    1. Dim Temp As New ArrayList
    2. For Each s As String In QuellArray
    3. If Temp.Contains(s) Then
    4. Continue For 'evtl. Zählvariable einfügen, wenn gezählt werden soll
    5. Else
    6. Temp.Add(s)
    7. End If
    8. Next
    9. Dim ZielArray() As String = Temp.ToArray(GetType(String))


    gruß
    hal2000
    Gruß
    hal2000
    Keine Ahnung ob es noch gebraucht wird. Aber ich wollte doch auch mal meinen Lösungsvorschlag vorstellen.

    In der Funktion „RemoveDoubleEntries“ werden als erstes die Einträge mit Hilfe des Quicksort Algorithmus sortiert und dann werden alle Einträge raus geworfen, die identisch zu ihrem Vorgänger sind. Als Rückgabewert erhält der Aufrufer die neue Größe des Arrays.

    VB.NET-Quellcode

    1. Sub Test()
    2. Dim Feld(9) As String
    3. Dim i As Integer
    4. Dim AnzahlEintraege As Long
    5. Feld(0) = "Caesar"
    6. Feld(1) = "Caesar"
    7. Feld(2) = "Anton"
    8. Feld(3) = "Dora"
    9. Feld(4) = "Berta"
    10. Feld(5) = "Anton"
    11. Feld(6) = "Berta"
    12. Feld(7) = "Caesar"
    13. Feld(8) = "Dora"
    14. Feld(9) = "Anton"
    15. AnzahlEintraege = RemoveDoubleEntries(Feld)
    16. For i = 0 To AnzahlEintraege - 1
    17. Debug.Print Feld(i)
    18. Next i
    19. End Sub
    20. Private Function RemoveDoubleEntries(ByRef Feld() As String) As Long
    21. Dim i As Long
    22. Dim j As Long
    23. Dim LetzterEintrag As String
    24. ' Feld sortieren
    25. Call QuickSort(Feld(), LBound(Feld), UBound(Feld))
    26. ' Doppelte Einträge entfernen
    27. LetzterEintrag = Feld(0)
    28. For i = 1 To UBound(Feld)
    29. If Feld(i) <> Feld(i - 1) Then
    30. j = j + 1
    31. Feld(j) = Feld(i)
    32. End If
    33. Next i
    34. ' Neue Arraygröße zurück geben
    35. RemoveDoubleEntries = j + 1
    36. End Function
    37. Private Sub QuickSort(ByRef Feld() As String, ByVal LB As Long, ByVal UB As Long)
    38. Dim P1 As Long, P2 As Long, Ref As String, TEMP As String
    39. P1 = LB
    40. P2 = UB
    41. Ref = Feld((P1 + P2) / 2)
    42. Do
    43. Do While (Feld(P1) < Ref)
    44. P1 = P1 + 1
    45. Loop
    46. Do While (Feld(P2) > Ref)
    47. P2 = P2 - 1
    48. Loop
    49. If P1 <= P2 Then
    50. TEMP = Feld(P1)
    51. Feld(P1) = Feld(P2)
    52. Feld(P2) = TEMP
    53. P1 = P1 + 1
    54. P2 = P2 - 1
    55. End If
    56. Loop Until (P1 > P2)
    57. If LB < P2 Then Call QuickSort(Feld(), LB, P2)
    58. If P1 < UB Then Call QuickSort(Feld(), P1, UB)
    59. End Sub
    hallo magerquark,

    lag wohl daran, dass deine Lösung bei dem Beispiel für das ichs gebraucht hab nicht funktioniert hätte.

    mir scheint eher, dass du - wie viele andere - nicht in der lage bist die möglichkeiten des framework umzusetzen.
    ich weiß nicht ob auch du aus der vb6 ecke kommst, aber viele derjenigen können vom alten denken nicht ablassen und
    produzieren code wie du ihn hier anbietest.

    versteh mich nicht falsch - nichts gegen dich.
    ist eher eine allgemeine sache.

    EDIT:
    @stefan2,
    was ist das ?
    Keine Ahnung ob es noch gebraucht wird.

    wenn es gebraucht wird, dann um alle unsicheren geister dieses forums auf einen schlechten weg zu bringen.
    sortierfunktionen werden in dotNet anderst umgesetzt
    und wie das suchen von doppelten einträgen funktioniert hat hal2000 eindrucksvoll vorgeführt.

    gruss

    mikeb69

    mikeb69 schrieb:


    mir scheint eher, dass du - wie viele andere - nicht in der lage bist die möglichkeiten des framework umzusetzen.

    Mag sein - aber nur dann wenn sie mir unbekannt sind, was daran liegt, dass ich mich noch nicht allzu lange und intensiv damit beschäftige. Ich bezweifle aber, dass dir die Groß- und Kleinschreibung unbekannt ist. Vielleicht bist du ja nicht in der Lage die Möglichkeiten der deutschen Rechtschreibung umzusetzen.
    Tut mir leid - aber "nicht in der Lage" kling für mich nach "zu dumm dafür". Ein ",dass dir - wie vielen anderen - die Möglichkeiten des Framework unbekannt sind" hätte es wohl besser getroffen.
    Und nach einer direkten "Beleidigung" halte ich auch ein
    nichts gegen dich
    für unverschämt.
    hallo magerquark,

    es war nicht meine absicht dich zu beleidigen.

    da es aber unschwer zu erkennen ist, das hal2000 kein anfänger ist, würde ich allen anfängern raten sich seinen ratschlag zu herzen zu nehmen.
    manchesmal - wie auch heute - nehme ich es mir zur aufgabe dies klar zustellen.

    denn wenn ein anderer neuling deinen post liesst könnte er meinen .....

    Edit:
    mir ist sehrwohl bewusst, dass die deutsche sprache über große buchstaben verfügt.
    nimm es als ein stilmittel meinerseits.
    zu meiner verteidigung sei gesagt, dass ich nicht über die hauptschule hinauskam. aber das nur nebenbei. :whistling:

    schönes wochenende noch

    gruss

    mikeb69
    Vertragt euch...

    @mike:
    Danke für den (die) netten Post(s) ^^.

    [...] dass ich nicht über die hauptschule hinauskam.
    Das hätte ich jetzt nicht vermutet, denn deine Rechtschreibung ist, im Gegensatz zu einigen anderen in diesem Forum, schlichtweg in Ordnung.

    @magerquark:
    Das Mega-For-Schleifenkonstrukt sieht wahrlich ein wenig unhandlich aus. Wenn du noch VB6 gewöhnt bist, solltest du dich unbedingt mit der Objektorientierung auseinandersetzen (macht Spaß, wenn man erstmal die Grundlagen [Vererbung, Polymorphie, Datenkapselung] verstanden hat).
    Ganz nebenbei sind die drei Begriffe in Klammern [] die Standbeine der Objektorientierung.

    @Stefan:
    Durch dieses Codemonster kann ich kaum durchblicken - es kommt auf jedem Fall aus VB6. Auch dir rate ich dringend zu einem Buch über VB.Net (ohne beleidigen zu wollen ;) )
    Der Grund: Ein Array sortiert man mit der Sort-Methode, welcher eine Vergleichklasse übergeben werden muss, die das Interface IComparer implementiert. Dieses Verfahren ist auf jeden Fall kürzer als der vorgestellte prozedurale (= nicht-objektorientierte) Code.

    gruß
    hal2000
    Gruß
    hal2000