【问题标题】:How to get min/max from ArrayList based on its object attribute values?如何根据其对象属性值从 ArrayList 获取最小值/最大值?
【发布时间】:2018-09-23 12:43:23
【问题描述】:

我想要实现的是从ArrayList<Object> 获取对象的最小/最大属性值。例如,如果Object 具有属性weight(float),我想要列表中最重的对象。

我尝试实现 Comparable 以获取最大/最小值,但由于某种原因,这会返回相同的最小值和最大值。 (我不知道它是否适用于浮动)

    val maxVal: Float = arrayList.max().floatVal1
    val minVal: Float = arrayList.min().floatVal1

    data class CustomObject(var val1: String, var floatVal1: Float , var floatVal2: Float?, var floatVal3: Float?, var floatVal4: Float?): Comparable<CustomObject>{
        override fun compareTo(other: CustomObject) = (floatVal1 - other.floatVal1).toInt()
    }

来自重复帖子的特定问题并未向我展示如何根据浮点数获取最大值/最小值。那就是问题所在。如果我想修改 Comparator 它只接受 Int。而且我无法使用该流功能,因为我的应用程序适用于 API 23+ 而不是 24+

【问题讨论】:

标签: arraylist kotlin comparable


【解决方案1】:
val maxObj: Object? = arrayList.maxByOrNull { it.floatVal1 }
val minObj: Object? = arrayList.minByOrNull { it.floatVal2 }

maxBy、minBy 自 Kotlin 1.4 起为 deprecated

【讨论】:

  • 按照the accepted answer 的建议,使用maxByOrNull 而不是minBy 有什么好处?您能否编辑您的答案以指出这种差异,并解释为什么或何时可能更喜欢它?谢谢。
  • @JeremyCaney 因为它们已被弃用。由于 maxByOrNull,minByOrNull 返回一个可为空的对象,我们可以检查并避免崩溃。
【解决方案2】:

我认为您正在寻找minBymaxBy

 val minObject: CustomObject? = arrayList.minBy { it.floatVal1 }
 val maxObject: CustomObject? = arrayList.maxBy { it.floatVal1 }

【讨论】:

  • 这些为您提供了列表中具有最小/最大floatVal1 值的CustomObject 实例,这不是您想要的吗?如果您想要实际的最小/最大值,您也可以从这些对象中读取它。
【解决方案3】:

这返回非空类型:

list.maxOf { it.value }
list.minOf { it.value }

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 2012-06-23
    • 1970-01-01
    • 2021-11-07
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多