Groovy/Java映射排序

Groovy/Java映射排序,java,map,groovy,hashmap,Java,Map,Groovy,Hashmap,我在地图中有带标志的百分比值,比如- [44.4:正确,0.0:错误,44.4:错误,38.9:错误,0.0错误] 我想把它们按降序排列。我使用的代码丢失了重复的密钥。我不想丢失它们,因为我想显示输出中的所有值 def secDisc = [:] def discount = plan."${section}" if(plan."${section}"!=null && plan.bluePlan) secDisc."$discount" = true else if(plan.

我在地图中有带标志的百分比值,比如- [44.4:正确,0.0:错误,44.4:错误,38.9:错误,0.0错误]

我想把它们按降序排列。我使用的代码丢失了重复的密钥。我不想丢失它们,因为我想显示输出中的所有值

def secDisc = [:]
def discount = plan."${section}"
if(plan."${section}"!=null && plan.bluePlan)
secDisc."$discount" = true
else if(plan."${section}"!=null && !plan.bluePlan)
secDisc."$discount" = false
secDisc = secDisc.sort {a, b -> b.key <=> a.key}
secDisc.each{disc, flag->

        println "disc- $disc flag- $flag"
 }
def secDisc=[:]
def折扣=计划“${section}”
if(plan.${section}!=null&&plan.bluePlan)
secDisc.“$折扣”=真
else if(plan.${section}!=null&&!plan.bluePlan)
secDisc.“$折扣”=错误
secDisc=secDisc.sort{a,b->b.key a.key}
secDisc.each{disc,flag->
println“disc-$disc flag-$flag”
}
打印时,只剩下一个0.0值。
谢谢

我会重新考虑您使用的数据结构类型。映射的值是布尔值,但您试图将多个相同的键放入映射中。这是行不通的

相反,我会尝试将这些值设置为布尔值列表,因此您的示例变成:

 [44.4: [true, false], 0.0: [false, false], 38.9: [false]]
这将确保不会丢失重复的密钥。此外,排序将更简单。此外,正如@tim_yates所提到的,我会将键转换为具有固定小数位数的字符串,以确保浮点数学不会产生与第12位小数稍有偏差的值


您没有提到排序对于具有不同值的相同键是否重要。

奇怪的是,您能够首先在映射中放置重复的值(如果备份存储实际上是一个
map
),或者您可能希望使用
标识hashmap
?不过,我不确定在Groovy中是如何做到这一点的。您可能想重新考虑使用小数作为映射键。我无法生成keys字符串,因为在此步骤中填充映射后,我正在按降序对它们进行排序-secDisc=secDisc.sort{a,b->b.key a.key}。用不同的值排序相同的键并不重要。我仍然会小心浮点数学上的差异。如果你不能做字符串,但是你知道有多少个有效数字,我会考虑乘以10 ^ 2(或者不管你在乎多少个十进制数字),而使用整数代替。