'Getting max value from an arraylist of objects?

Is there an easy way to get the max value from one field of an object in an arraylist of objects? For example, out of the following object, I was hoping to get the highest value for the Value field.

Example arraylist I want to get the max value for ValuePairs.mValue from.

ArrayList<ValuePairs> ourValues = new ArrayList<>();
outValues.add(new ValuePairs("descr1", 20.00));
outValues.add(new ValuePairs("descr2", 40.00));
outValues.add(new ValuePairs("descr3", 50.00));

Class to create objects stored in arraylist:

public class ValuePairs {

    public String mDescr;
    public double mValue;

    public ValuePairs(String strDescr, double dValue) {
        this.mDescr = strDescr;
        this.mValue = dValue;
    }
}

I'm trying to get the max value for mValue by doing something like (which I know is incorrect):

double dMax = Collections.max(ourValues.dValue);

dMax should be 50.00.



Solution 1:[1]

Use a Comparator with Collections.max() to let it know which is greater in comparison.


Also See

Solution 2:[2]

With Java 8 you can use stream() together with it's predefined max() function and Comparator.comparing() functionality with lambda expression:

ValuePairs maxValue = values.stream().max(Comparator.comparing(v -> v.getMValue())).get();

Instead of using a lambda expression, you can also use the method reference directly:

ValuePairs maxValue = values.stream().max(Comparator.comparing(ValuePairs::getMValue)).get();

Solution 3:[3]

This has been answered multiple time already, but since it's the first result on google I will give a Java 8 answer with an example.

Take a look at the stream feature. Then you can get the max form an List of Objects like this:

List<ValuePairs> ourValues = new ArrayList<>();

ourValues.stream().max(comparing(ValuePairs::getMValue)).get()

By the way in your example, the attributes should be private. You can then access them with a getter.

Solution 4:[4]

You should iterate over the list comparing/finding the max value O(N). If you need to do this often replace the list with a PriorityQueue O(1) to find the max.

Solution 5:[5]

Here fist and last is intervals between two indexes of arraylist you can also get for a complete list by removing them and i=0 upto size of float list.

// for min value

public String getMinValue(ArrayList list, int first, int last) {

        List<Float> floatList = new ArrayList<>();

        for (int i = 0; i < list.size(); i++) {
            Float prova2 = ((Double) list.get(i)).floatValue();
            floatList.add(prova2);
        }
        float min = Float.MAX_VALUE;
        String minValue = "";

        for (int i = first; i < last; i++) {


            if (floatList.get(i) < min) {
                min = floatList.get(i);
            }
        }
        minValue = String.format("%.1f", min);
        return minValue;
    }

// for max value

    public String getMaxValue(List<Object> list, int first, int last) {

        List<Float> floatList = new ArrayList<>();

        for (int i = 0; i < list.size(); i++) {
            Float prova2 = ((Double) list.get(i)).floatValue();
            floatList.add(prova2);
        }

        float max = Float.MIN_VALUE;
        String maxValue = "";

        for (int i = first; i < last; i++) {


            if (floatList.get(i) > max) {
                max = floatList.get(i);
            }
        }
        maxValue = String.format("%.1f", max);
        return maxValue;
    }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Community
Solution 2
Solution 3 Paul Fournel
Solution 4 Cratylus
Solution 5 Akash Namdev