在grovvy中排序地图列表

时间:2016-11-20 14:31:15

标签: groovy

嗨我有一个groovy中的地图列表,如

def v=[[val1:'FP'],[val1:'LP'],[val1:'MP'],[val1:'MP'],[val1:'LP'],[val1:'FP']]

我想根据以下订单FP,MP,LP进行排序

我试过

v.sort{x,y->
  x.val1 <=> y.val1
}

打印按字母顺序排序的[[val1:FP], [val1:FP], [val1:LP], [val1:LP], [val1:MP], [val1:MP]],但我需要按以下格式对其进行排序 的 FP,MP,LP

2 个答案:

答案 0 :(得分:2)

正如评论中所述,您需要定义首选订单,然后根据该排序...以及您的地图列表:

def v=[[val1:'FP'],[val1:'LP'],[val1:'MP'],[val1:'MP'],[val1:'LP'],[val1:'FP']]

首选结果顺序:

def preferredOrder = ['FP', 'MP', 'LP']

然后,您可以根据值索引对此首选顺序进行排序:

v.sort(false) { preferredOrder.indexOf(it.val1) }

或者,如果您想要将未知元素(即:[val1:'ZP'])放在排序列表的末尾,那么您可以执行以下操作:

v.sort(false) { preferredOrder.indexOf(it.val1) + 1 ?: it.val1 }

因此,如果找不到它们(索引-1),则将它们的字符串名称

进行比较

这个问题类似于this one btw,答案中有更多选项

答案 1 :(得分:2)

另一种选择:每当我处理固定的,有序的字符串列表时,我立即想到使用枚举:

enum PValue { FP, MP, LP }

现在我们有一组有序的常量,可以很容易地转换为字符串值和从字符串值转换。所以排序看起来很简单:

v.sort { x, y -> PValue[x.val1] <=> PValue[y.val1] }

编辑:甚至更简单:

v.sort { PValue[it.val1] }