【问题标题】:Get entry with max value from Map in Kotlin从 Kotlin 中的 Map 获取具有最大值的条目
【发布时间】:2017-10-31 00:17:28
【问题描述】:

我不明白如何使用 Map 接口中的 maxBymaxWith 方法。我有这个代码:

var myMap: Map<String, Int> = mutableMapOf()
// ...
var best = myMap.maxBy { ??? }

我想获得最大值的条目,但我不知道要传递给maxBymaxWith

【问题讨论】:

  • 如果刚接触 kotlin 的人很好奇为什么可以有不带括号 () 的 maxBy 函数,原因是当唯一的函数参数是 lambda 时——maxBy 函数是这样,那么你可以省略括号,而不是直接用 lambda 放置花括号

标签: kotlin


【解决方案1】:

MaxBy

MaxBy 将值转换为可比较类型,并通过计算值进行比较

MaxWith

MaxWith 将项目相互比较,并根据比较器的返回值对它们进行排序。

使用哪个

MaxBy 通常更有意义,因为它通常更快(尽管 YMMV),并且因为实现可以更简单,但如果项目只能通过比较进行排序,则可能需要 maxWith。

如何使用

这将获得最高值的条目:

var maxBy = myMap.maxBy { it.value }

与 maxWith 相同的代码如下所示:

val maxWith = myMap.maxWith(Comparator({a, b -> a.value.compareTo(b.value)}))

【讨论】:

  • 如果出现平局,MaxBy 的行为是什么?
  • maxBy 已弃用,更新示例以使用 maxByOrNull 是有意义的。
  • 看起来它根本不起作用。 IntelliJ 告诉我以下代码由于多种原因无法编译:` val MyMap = HashMap // ... 添加一些数据 val max: Int = myMap.maxOfWithOrNull(Comparator({ a, b -> a. value.compareTo(b.value) }))`
【解决方案2】:

创建一个如下所示的类

 data class Student(val name: String, val age: Int)

现在转到 Oncreate

 val public = listOf(Student("param",29),
            Student("nilesh", 19),
            Student("rahul", 13),
            Student("venkat", 12),
            Student("Ram", 22),
            Student("Sonam", 18))

现在是创建中的 maxBy

val maxAge=public.maxBy { p-> p.age }
    println(maxAge)
    println("Student Name: ${maxAge?.name}" )
    println("Student Age: ${maxAge?.age}" )

对于创建中的 minBy

val minAge = public.minBy { p->p.age }
    println(minAge)
    println("Student Name: ${minAge?.name}" )
    println("Student Age: ${minAge?.age}" )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2019-06-24
    • 2011-11-21
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多