Groovy 如何根据已按降序排序的映射按降序排序列表
我有一个JSON数组映射列表,类似于: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']] 我按方法
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