【问题标题】:Sort a Map<Int, Int> by value then by key对 Map<Int, Int> 按值排序,然后按键排序
【发布时间】:2021-11-22 17:06:47
【问题描述】:

我有一个值映射,其中键是数字,值是字符串中数字出现的次数

示例:

6644241333431
{6:2,4:4,2:1,3:4,1:2}

我想得到出现次数最多的数字,如果两个数字相等,则取较小的那个。 我觉得可以用“.sortedBy{ (key, value) -> ... }”甚至“compareBy{ it.first }.thenBy{it.second}”来完成。

【问题讨论】:

  • 我只是想解释一下地图的样子,我可能用错了字符来困住我的数字对不起:/ 是的,正如你所说的
  • 好的,那你为什么要排序呢?您可以简单地迭代条目即可获得最大值。这将是线性时间,并且比排序更快
  • 首先添加,我用我知道的方式(一些“if”和循环)实现了这个方法,就像我每次编码一样。但是我正在尝试做所有不同的事情并且“做得更好”,因为我意识到那时我并没有变得更好,所以我想知道是否有更好的方法来获取出现次数最多的数字(我正在寻找将其放入.key[0] 点)。但我猜你是对的,它在硬件上更重:/所以不是很有用
  • 等等,所以你真的不需要排序,只需要最大值?
  • 是的,但我已经知道如何获得最大价值,我也在寻找更多关于排序的知识

标签: sorting dictionary kotlin


【解决方案1】:

您几乎可以按照您描述的方式执行此操作:

map.entries
    .sortedWith(compareByDescending<Map.Entry<Int, Int>> { it.value }.thenByDescending { it.key })

它返回一个列表,而不是地图。如果需要,您可以将其转换回地图。

如果你只需要一个最大值,那么排序确实没有必要,你可以通过与上面类似的方式找到它:

map.maxOfWith(compareBy<Map.Entry<Int, Int>> { it.value }.thenBy { it.key }) { it }

【讨论】:

  • 非常感谢您的快速答复!我应该更多地搜索条目是什么。我不得不改变“thenBy”,这样它才能做我想要的,但非常感谢!有一个美好的一天 map.entries.sortedWith(compareByDescending> { it.value }.thenBy { it.key })
  • 另见更新的答案。如果您只需要最大值,那么改用maxOfWih() 会更有意义。
猜你喜欢
  • 2013-11-19
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 2020-03-19
  • 2016-11-03
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多