Martin
Martin

Reputation: 2914

How to get min/max from ArrayList based on its object attribute values?

What I want to achieve is to get min/max attribute value of object from ArrayList<Object>. For example if Object has attribute weight(float), I want heaviest object from the list.

I've tried to implement Comparable to get max/min value but this returns same value for min and same for max for some reason. (I don't know if it works with floats)

    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()
    }

That specific question from duplicate post does not show me how to get max/min value based on Float. That's the problem. If I want to modify Comparator it accepts only Int. And i cant use that stream feature because my app is for API 23+ not 24+

Upvotes: 23

Views: 22925

Answers (4)

Falchio
Falchio

Reputation: 648

This return non-null types:

val max = list.maxOf { it.value }
val min = list.minOf { it.value }

Upvotes: 4

Tarun Anchala
Tarun Anchala

Reputation: 2742

Below Code returns Max value of your parameter in list of objects.

Ex)100 is max marks obtained all students

list.maxOf { it.yourParameter } // Returns Max value of yourParameter value in list of objects

Below Code returns Object of Max value of your parameter in list of objects.

Ex)Student object who got 100 marks

list.maxBy { it.yourParameter } // Returns Object of Max of yourParameter value in list of objects

Upvotes: 1

ajw
ajw

Reputation: 2702

val maxObj: Object? = arrayList.maxByOrNull { it.floatVal1 }
val minObj: Object? = arrayList.minByOrNull { it.floatVal2 }

maxBy, minBy are deprecated since Kotlin 1.4

Upvotes: 21

zsmb13
zsmb13

Reputation: 89618

I think you're looking for minBy and maxBy:

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

Upvotes: 39

Related Questions