2017-06-12 67 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]]