16

有没有一种简单的方法可以从对象数组列表中对象的一个​​字段中获取最大值?例如,在以下对象中,我希望获得 Value 字段的最高值。

示例数组列表我想从中获取 ValuePairs.mValue 的最大值。

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));

用于创建存储在 arraylist 中的对象的类:

public class ValuePairs {

    public String mDescr;
    public double mValue;

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

我正在尝试通过执行以下操作来获取 mValue 的最大值(我知道这是不正确的):

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

dMax 应为 50.00。

4

5 回答 5

22

使用ComparatorwithCollections.max()让它知道哪个比较大。


另见

于 2013-10-12T20:09:13.407 回答
19

使用 Java 8,您可以将其与 lambda 表达式stream()的预定义max()函数和功能一起使用:Comparator.comparing()

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

除了使用 lambda 表达式,您还可以直接使用方法引用:

ValuePairs maxValue = values.stream().max(Comparator.comparing(ValuePairs::getMValue)).get();
于 2017-11-22T08:29:43.050 回答
9

这已经被多次回答了,但由于它是谷歌上的第一个结果,我将给出一个 Java 8 的答案和一个例子。

看看功能。然后你可以得到一个对象列表的最大值,如下所示:

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

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

顺便说一下,在您的示例中,属性应该是私有的。然后,您可以使用 getter 访问它们。

于 2015-12-20T13:47:05.183 回答
1

您应该遍历列表比较/查找最大值O(N)。如果您需要这样做,通常用PriorityQueue O(1)替换列表以找到最大值。

于 2013-10-12T20:09:22.897 回答
0

这里 first 和 last 是 arraylist 的两个索引之间的间隔,您也可以通过删除它们和 i=0 到浮动列表的大小来获得完整列表。

// 最小值

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;
    }

// 最大值

    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;
    }
于 2020-05-12T06:28:44.027 回答