从列表中获取没有重复(Groovy)

时间:2017-04-22 20:29:11

标签: groovy

我有以下列表和代码

def myList = [[id:8100-04, name:AAA, code:2281], 
             [id:8100-05, name:BBB, code:2102], 
             [id:8100-06, name:CCC, code:6089], 
             [id:8100-07, name:CCC, code:6089], 
             [id:8100-08, name:CCC, code:6089]]
//list is retrived but looks something like the above

def newList = myList.findAll { 
            (it.get("Name").equals("AAA") || 
                it.get("Name").equals("BBB") || 
                it.get("Name").equals("AFBO") ||
                it.get("Name").equals("CCC")) }
def filteredListData = newList.collect { getListData(it.get("Id"), it.get("Name"), 
                                          it.get("Code")) }

我想检索我的所有newList,如果有重复,则检索具有最低id索引的条目。

所以从myList我正在寻找结果:

[[id:8100-04, name:AAA, code:2281], 
[id:8100-05, name:BBB, code:2102], 
[id:8100-06, name:CCC, code:6089]]

3 个答案:

答案 0 :(得分:0)

你快到了。

def myList = [
                 [id:"8100-04", name:"AAA", code:2281], 
                 [id:"8100-05", name:"BBB", code:2102], 
                 [id:"8100-06", name:"CCC", code:6089], 
                 [id:"8100-07", name:"CCC", code:6089], 
                 [id:"8100-08", name:"CCC", code:6089]
             ]

def newList = myList.findAll { 
                it.name in ["AAA", "BBB", "AFBO", "CCC"]
               }

def map = [:]

newList.each{
    if(!map.get(it.name))
        map.put(it.name, it)

}               

println map*.value

输出

[
 [id:8100-04, name:AAA, code:2281],
 [id:8100-05, name:BBB, code:2102],
 [id:8100-06, name:CCC, code:6089]
]

答案 1 :(得分:0)

这是一个更“功能性”的解决方案。我们按名称分组,这给出了每个名称的列表。然后我们对每个列表进行排序并获取其第一个元素。

def myList = [[id:'8100-04', name:'AAA', code:2281], 
             [id:'8100-05', name:'BBB', code:2102], 
             [id:'8100-07', name:'CCC', code:6089], 
             [id:'8100-06', name:'CCC', code:6089], 
             [id:'8100-08', name:'CCC', code:6089]]

def newList = myList.findAll { 
                it.name in ["AAA", "BBB", "AFBO", "CCC"]
               }

def groups = newList.groupBy {it -> it.name}

def lowestIds = groups.collect({it.value.sort{it.id}[0]})

println lowestIds

更简单:

newList.sort{it.id}.unique{it.name}

println newList

答案 2 :(得分:0)

以下是解决的脚本:

  • 未排序的商品,请注意订单已在myList下方更改。
  • OP没有提到重复的标准。这会根据name and code
  • 考虑重复
def myList = [[id:'8100-07', name:'CCC', code:6089],
              [id:'8100-04', name:'AAA', code:2281],
              [id:'8100-05', name:'BBB', code:2102],
              [id:'8100-06', name:'CCC', code:6089], 
              [id:'8100-08', name:'CCC', code:6089]]


def newList = myList.findAll {
                it.get("name").equals("AAA") ||
                it.get("name").equals("BBB") ||
                it.get("name").equals("AFBO") ||
                it.get("name").equals("CCC")
} 
//Sort by order id, name and code fields
def criteria = { a,b -> a.id <=> b.id ?: a.name <=> b.name ?: a.code?: b.code }
//Group by name and code ; apply sort; get the first item; apply sort on final result
def result = newList.groupBy({it.name}, {it.code}).inject([]){li, k, v-> v.collect {key, value -> li << value.sort(criteria)[0]}; li}.sort(criteria)
println result

您可以快速在线试用 Demo