【问题标题】:Getting max value from an arraylist of objects?从对象数组列表中获取最大值?
【发布时间】:2013-10-12 20:07:44
【问题描述】:

有没有一种简单的方法可以从对象数组列表中的对象的一个​​字段中获取最大值?例如,在以下对象中,我希望获得 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。

【问题讨论】:

    标签: java


    【解决方案1】:

    ComparatorCollections.max() 一起使用,让它知道哪个更大。


    另见

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 有没有办法让所有 ValuePairs 匹配.max()
      • 找到最大值后会是这样的:List&lt;ValuePairs&gt; maxValues = ourValues.stream().filter(v -&gt; v.mValue == maxValue.mValue).collect(Collectors.toList());
      【解决方案3】:

      这个问题已经回答了很多次了,但是因为它是谷歌上的第一个结果,所以我会给出一个 Java 8 的答案和一个例子。

      看看stream 功能。然后你可以像这样得到一个对象列表的最大值:

      List<ValuePairs> ourValues = new ArrayList<>();
      
      ourValues.stream().max(comparing(ValuePairs::getMValue)).get()
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          这里的 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;
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-21
            相关资源
            最近更新 更多