嗨我有一个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
答案 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] }