我是新來的Groovy和我試圖合併列表共享鍵,輸出中必須重點,分列表1,子列表2 ...合併列表共享密鑰在Groovy
["08_087C", 1 , 225]
["08_087C", 0 , 179]
// Out
["08_087C", [0 , 179], [1 , 225]]
子列表的順序無關緊要。
在沒有「重新發明輪子」的情況下,做到這一點的正確方法是什麼?
我是新來的Groovy和我試圖合併列表共享鍵,輸出中必須重點,分列表1,子列表2 ...合併列表共享密鑰在Groovy
["08_087C", 1 , 225]
["08_087C", 0 , 179]
// Out
["08_087C", [0 , 179], [1 , 225]]
子列表的順序無關緊要。
在沒有「重新發明輪子」的情況下,做到這一點的正確方法是什麼?
如果你在談論的 「鑰匙」一個列表的上下文,你的結果大多數 可能應該是一個地圖,這使得以後處理很容易,如果你想 訪問您的數據說的關鍵。以下代碼與您詢問 時完全相同。
它將您的行按第一個元素分組,並將它們放在該行的 鍵上。由於你的例子是排序的,但你沒有提及,你的約束 那裏,我假設你可以使用默認的排序順序。
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],]]
看到這有助於
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
你可以只用交性質上列表如下
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]]
列表沒有鑰匙,他們擁有的元素。你是在談論合併地圖,哪裏有關鍵和價值,價值可以是列表? – mohsenmadi