Array nach Primärschlüssel und Unterwerten sortieren

  • Hallo,

    ich habe es jetzt ein paar Stunden versucht - und komme auf keine Lösung.. vielleicht habe ich ein Brett vor'm Kopf.

    Ich habe ein Array das ist z.B. wie folgt aufgebaut ( Jedes minus symbolisiert eine neue Spalte )
    [1] - Peter - Gürtel
    [2] - Peter - Schuh
    [3] - Maria - Schnalle
    [4] - Peter - Handschuh

    Ich möchte nun, dass daraus entsteht
    [1] - Peter - Gürtel, Schuh, Handschuh
    [2] - Maria - Schnalle

    Oder so etwas in der Art. Halt, dass der Primärschlüssel - in diesem Fall die beiden Personen, nur einmal in der Auflistung vorkommen und die dazugehörigen Attribute diesen Primärschlüsseln zuweisbar sind - wie auch immer sich dass dann gestaltet.. größeres Array wär wohl auch möglich !

    Über eine Idee die mehr als nur ein "_arrayUnique" enthält, wäre ich dankbar !

    Beste Grüße

    Einmal editiert, zuletzt von abc-user (28. Oktober 2010 um 01:09)

  • Spoiler anzeigen
    [autoit]

    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aSource[4][2] = [["Peter", "Gürtel"],["Peter", "Schuh"],["Maria", "Schnalle"],["Peter", "Handschuh"]]
    _ArrayDisplay($aSource, "Vorher")
    $aUnique = _ArrayUnique($aSource, 1, 0, 1)
    If Not @error Then
    Dim $aResult[$aUnique[0]][2]
    For $j = 1 To $aUnique[0]
    $aResult[$j - 1][0] = $aUnique[$j]
    $aIndex = _ArrayFindAll($aSource, $aUnique[$j])
    If Not @error Then
    For $k = 0 To UBound($aIndex) - 1
    $aResult[$j - 1][1] &= $aSource[$aIndex[$k]][1] & ","
    Next
    EndIf
    Next
    EndIf
    _ArrayDisplay($aResult, "Nachher")

    [/autoit]
    • Offizieller Beitrag

    Eine Version mit Dictionary-Object:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Dim $aSource[4][2] = [["Peter", "Gürtel"],["Peter", "Schuh"],["Maria", "Schnalle"],["Peter", "Handschuh"]]

    [/autoit] [autoit][/autoit] [autoit]

    $oDictionary = ObjCreate('Scripting.Dictionary') ; jetzt standardmäßig im Binärmode
    $oDictionary.CompareMode = 1 ; den Textmode setzen
    For $i = 0 To UBound($aSource, 1) - 1
    If Not $oDictionary.Exists($aSource[$i][0]) Then
    $oDictionary.Add($aSource[$i][0], $aSource[$i][1])
    Else
    $oDictionary.Item($aSource[$i][0]) = $oDictionary.Item($aSource[$i][0]) & ', ' & $aSource[$i][1]
    EndIf
    Next
    Dim $aOut[$oDictionary.Count][2], $i = 0
    For $strKey in $oDictionary.Keys
    $aOut[$i][0] = $strKey
    $aOut[$i][1] = $oDictionary.Item($strKey)
    $i += 1
    Next
    _ArrayDisplay($aOut)

    [/autoit]
  • Es gibt bestimmt viele Möglichkeiten. Hier wäre meine.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aArray[6][2] = [["Peter", "Gürtel"], ["Peter", "Schuh"], ["Maria", "Schnalle"], ["Peter", "Handschuh"], ["Maria", "Hut"], ["Tom", "Jacke"]]
    Global $sLastIndex, $iFirstFoundIndex, $i = 0

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aArray, "Vorher")

    [/autoit] [autoit][/autoit] [autoit]

    _ArraySort($aArray)
    While 1
    If $sLastIndex = $aArray[$i][0] Then
    $aArray[$iFirstFoundIndex][1] &= ", " & $aArray[$i][1]
    _ArrayDelete($aArray, $i)
    Else
    $iFirstFoundIndex = $i
    $sLastIndex = $aArray[$i][0]
    If $i = UBound($aArray) - 1 Then ExitLoop
    $i += 1
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aArray, "Nachher")

    [/autoit]
  • Meine Güte, so viele Möglichkeiten? Vielen Dank, die werde ich nachher alle testen und Rückmeldung geben !

    Grüße

  • Ersteinmal vielen Dank für die zahlreichen Antworten.

    Ich habe mich für die Lösung von Oscar entschieden, da diese in meiner Simulation die Schnellste war !

    Beste Grüße