我是新来的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