2017-06-12 94 views
0

我是新來的Groovy和我試圖合併列表共享鍵,輸出中必須重點,分列表1,子列表2 ...合併列表共享密鑰在Groovy

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

子列表的順序無關緊要。

在沒有「重新發明輪子」的情況下,做到這一點的正確方法是什麼?

+0

列表沒有鑰匙,他們擁有的元素。你是在談論合併地圖,哪裏有關鍵和價值,價值可以是列表? – mohsenmadi

回答

0

如果你在談論的 「鑰匙」一個列表的上下文,你的結果大多數 可能應該是一個地圖,這使得以後處理很容易,如果你想 訪問您的數據說的關鍵。以下代碼與您詢問 時完全相同。

它將您的行按第一個元素分組,並將它們放在該行的 鍵上。由於你的例子是排序的,但你沒有提及,你的約束 那裏,我假設你可以使用默認的排序順序。

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],]] 

而這裏是相同的代碼來創建一個地圖代替。差異是使用的collectEntries代替collect

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

看到這有助於

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

你可以只用交性質上列表如下

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 
} 

輸出:

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