2017-06-12 5 views
0

Ich bin neu zu Groovy und ich versuche, Listen zu fusionieren einen Schlüssel teilen, muss der ouput seinen Schlüssel, Unter list1, sub-list2 ...Merging Liste einen Schlüssel in Groovy teilt

["08_087C", 1 , 225] 
["08_087C", 0 , 179] 
// Out 
["08_087C", [0 , 179], [1 , 225]] 

Die Reihenfolge der Unterlisten spielt keine Rolle.

Was wäre der richtige Weg, dies zu tun, ohne das Rad neu zu erfinden?

+0

Listen Schlüssel nicht haben, sie Elemente haben. Sprechen Sie stattdessen über das Zusammenführen von Karten, wo es einen Schlüssel und einen Wert gibt und Werte Listen sein können? – mohsenmadi

Antwort

0

Wenn Sie sprechen von "Schlüssel" in Der Kontext einer Liste, Ihr Ergebnis am meisten sollte wahrscheinlich eine Karte sein, die spätere Behandlung macht viel einfacher, wenn Sie möchten Zugriff auf Ihre Daten mit diesem Schlüssel. Der folgende Code, tut genau so, wie Sie für gefragt haben.

Es gruppiert Ihre Zeilen nach dem ersten Element und fügt sie in eine einzelne Zeile auf diesem Schlüssel . Da Ihr Beispiel zwar sortiert ist, Sie aber Ihre Einschränkungen dort nicht erwähnt haben, gehe ich davon aus, dass Sie mit der Standard-Sortierreihenfolge leben können.

def data = [ 
    ["08_087C", 1, 225], 
    ["08_087C", 0, 179], 
] 

assert data.groupBy{ 
    it.head() 
}.collect{ k, v -> 
    [k] + v*.tail().sort() 
} == [["08_087C", [0, 179], [1, 225],]] 

Und hier ist der gleiche Code, um stattdessen eine Karte zu erstellen. Die Unterschiede ist die Verwendung von collectEntries statt collect:

assert data.groupBy{ 
    it.head() 
}.collectEntries{ k, v -> 
    [k, v*.tail().sort()] 
} == ["08_087C": [[0, 179], [1, 225],]] 
0

sehen diese

def l1 = ["08_087C", 1 , 225] 
def l2 =["08_087C", 0 , 179] 
def out= [l1.intersect(l2), [l1.minus(l2)],[l2.minus(l1)]] 
println out 
0

hilft Sie können nur die Kreuzung Eigenschaft der Liste verwenden, wie unten

List firstList = ​["08_087C", 1 , 225] 
List secondList = ["08_087C", 0 , 179] 

//check if they have common element 
def intersectElement = secondList.intersect(firstList) ? secondList.intersect(firstList)[0] : null 
if(intersectElement){ 

    //build the final list 
    List outputList = [intersectElement, firstList.minus(intersectElement),secondList.minus(intersectElement)] 
    println "outputList : " + outputList 
} 

Ausgang:

outputList : ["08_087C", [1, 225], [0, 179]] 
Verwandte Themen