Groovy grovvy中地图的排序列表

Groovy grovvy中地图的排序列表,groovy,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 } v.sort{x,y-> x、 val1 y.val1 } 它打印[[val1:FP],[val1:FP],[val1:LP],[val1:LP],[v

嗨,我有一个类似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
}
v.sort{x,y->
x、 val1 y.val1
}
它打印
[[val1:FP],[val1:FP],[val1:LP],[val1:LP],[val1:MP],[val1:MP]]
,按字母顺序排序,但我需要按以下格式排序
FP、MP、LP

正如评论中所说,您需要定义一个首选顺序,然后根据该顺序进行排序。。。因此,使用您的地图列表:

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),则会根据它们的字符串名称对它们进行比较


这个问题类似于btw,答案中有更多选项,正如评论中所说,您需要定义一个首选顺序,然后根据该顺序进行排序。。。因此,使用您的地图列表:

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),则会根据它们的字符串名称对它们进行比较


这个问题类似于btw,它的答案中有更多选项。

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

enum PValue { FP, MP, LP }
现在我们有了一组有序的常量,可以很容易地转换字符串值。因此,排序看起来很简单,如下所示:

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

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

enum PValue { FP, MP, LP }
现在我们有了一组有序的常量,可以很容易地转换字符串值。因此,排序看起来很简单,如下所示:

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

创建一个映射,将每个字符串(FP、MP、LP)关联到一个顺序值(1、2、3),并在比较器中比较与每个字符串关联的值。或者使用枚举而不是字符串。谢谢你的回复,有没有更常规的方法来实现这一点?我不知道。但我也看不出使用枚举或映射有什么不符合常规的地方。所有不能“字母数字”排序的东西都需要有自己的
比较器
,在这种情况下,它基于
['b'、'a'、'c']。indexOf(it)
创建一个映射,将每个字符串(FP、MP、LP)关联到一个顺序值(1、2、3),并比较比较器中与每个字符串关联的值。或者使用枚举而不是字符串。谢谢你的回复,有没有更常规的方法来实现这一点?我不知道。但我也看不出使用枚举或映射有什么不符合常规的地方。所有不能“字母数字”排序的东西都需要有自己的
比较器,在这种情况下,它基于
['b','a','c'].indexOf(it)