【问题标题】:Groovy/Java map sortGroovy/Java 地图排序
【发布时间】:2013-06-14 19:01:28
【问题描述】:

我在带有标志的地图中有百分比值,例如- [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"
 }

当我打印它时,只剩下一个 0.0 值。 谢谢!

【问题讨论】:

  • 奇怪的是,您首先能够将重复值放入映射中(如果后备存储确实是Map)——或者您可能想要使用IdentityHashMap ?不过,不确定您是如何在 Groovy 中做到这一点的。
  • 您可能想重新考虑使用小数作为 Map 键

标签: java map groovy hashmap


【解决方案1】:

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

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

 [44.4: [true, false], 0.0: [false, false], 38.9: [false]]

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

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

【讨论】:

  • 谢谢。我无法创建键字符串,因为在此步骤中填充地图后,我按降序对它们进行排序 - secDisc = secDisc.sort {a, b -> b.key a.key}。具有不同值的相同键的排序无关紧要。
  • 我仍然会小心浮点数学差异。如果你不能做字符串,但你知道有多少有效数字,我会考虑乘以 10^2(或者你关心的任何十进制数字)并改用整数。
猜你喜欢
  • 2012-11-04
  • 2020-04-22
  • 1970-01-01
  • 2014-01-20
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多