从一个对象的ArrayList中获取最大值?

21

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

我想要获取max value for 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。

5个回答

31

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

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

你可以直接使用方法引用,而不是使用lambda表达式:

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

1
有没有一种方法可以获取与 .max() 匹配的 所有 ValuePairs - Nato Boram
在找到最大值后,代码应该类似于这样:List<ValuePairs> maxValues = ourValues.stream().filter(v -> v.mValue == maxValue.mValue).collect(Collectors.toList()); - M. Schena

24

9

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

看一下流(Stream)功能stream。然后你可以像这样从对象列表中获取最大值:

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

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

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


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

0

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

// 获取最小值

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接