Groovy 如何根据已按降序排序的映射按降序排序列表

Groovy 如何根据已按降序排序的映射按降序排序列表,groovy,Groovy,我有一个JSON数组映射列表,类似于: def listOfMap = [[TESTCASE:1, METHOD:'CLICK', RESULT:'PASS'], [TESTCASE:2, METHOD:'CLICK', RESULT:'FAIL'], [TESTCASE:3, METHOD:'CLICK', RESULT:'FAIL'], [TESTCASE:4, METHOD:'TYPETEXT', RESULT:'FAIL']] 我按方法

我有一个JSON数组映射列表,类似于:

def listOfMap = [[TESTCASE:1, METHOD:'CLICK', RESULT:'PASS'],  
      [TESTCASE:2, METHOD:'CLICK', RESULT:'FAIL'],  
      [TESTCASE:3, METHOD:'CLICK', RESULT:'FAIL'],   
      [TESTCASE:4, METHOD:'TYPETEXT', RESULT:'FAIL']]
我按方法名称分组,并收集每个方法的失败百分比

def percentage (map){
     (map.FAIL ?: 0) / ((map.PASS ?: 0) + (map.FAIL ?: 0)) * 100
}

def result = listOfMap.groupBy{it.METHOD}
                      .collectEntries{[(it.key) : percentage(it.value.countBy{it.RESULT})]}
现在我的输出将是[点击:66.6,键入文本:100]

要按百分比降序对上述结果进行排序

def sortedResult = result.sort { a, b -> b.value <=> a.value }
基本上,我正在寻找这些数据来创建一个CSV报告,类似下面给出的listofMap:


鉴于原帖中的这一点:

def listOfMap = [[TESTCASE:1, METHOD:'CLICK', RESULT:'PASS'],  
      [TESTCASE:2, METHOD:'CLICK', RESULT:'FAIL'],  
      [TESTCASE:3, METHOD:'CLICK', RESULT:'FAIL'],   
      [TESTCASE:4, METHOD:'TYPETEXT', RESULT:'FAIL']]
考虑使用Expando,以便百分比是一个字段,但同时也是passCount和failCount:


您可以进行多重分组,使您的生活更轻松:

def listOfMap = [[TESTCASE: 1, METHOD: 'CLICK', RESULT: 'PASS'],
    [TESTCASE: 2, METHOD: 'CLICK', RESULT: 'FAIL'],
    [TESTCASE: 3, METHOD: 'CLICK', RESULT: 'FAIL'],
    [TESTCASE: 4, METHOD: 'TYPETEXT', RESULT: 'FAIL']]

def result = listOfMap.groupBy({ it.METHOD }, { it.RESULT })
                      .collectEntries { method, r ->
    def passCount = r.PASS?.size() ?: 0
    def failCount = r.FAIL?.size() ?: 0
    [method, [passCount: passCount, failCount: failCount, failPercentage: (failCount / (passCount + failCount) * 100.0)]]
}.sort { -it.value.failPercentage }
然后,您可以执行以下操作:

result.values().failCount

获取问题中所需的数字

最好不要试图以相同的顺序保存多个单独的列表,这样更容易将所有数据存储在一起,并在对整个数据进行排序后提取

$ groovy Example.groovy 
TYPETEXT={failCount=1, percentage=100, passCount=0}
CLICK={failCount=2, percentage=66.6666666700, passCount=1}
def listOfMap = [[TESTCASE: 1, METHOD: 'CLICK', RESULT: 'PASS'],
    [TESTCASE: 2, METHOD: 'CLICK', RESULT: 'FAIL'],
    [TESTCASE: 3, METHOD: 'CLICK', RESULT: 'FAIL'],
    [TESTCASE: 4, METHOD: 'TYPETEXT', RESULT: 'FAIL']]

def result = listOfMap.groupBy({ it.METHOD }, { it.RESULT })
                      .collectEntries { method, r ->
    def passCount = r.PASS?.size() ?: 0
    def failCount = r.FAIL?.size() ?: 0
    [method, [passCount: passCount, failCount: failCount, failPercentage: (failCount / (passCount + failCount) * 100.0)]]
}.sort { -it.value.failPercentage }
result.values().failCount
result.values().passCount