【问题标题】:How to get maximum value from the Collection (for example ArrayList)?如何从集合中获取最大值(例如 ArrayList)?
【发布时间】:2011-11-29 01:35:15
【问题描述】:

有一个存储整数值的 ArrayList。我需要在这个列表中找到最大值。例如。假设 arrayList 存储的值是:10, 20, 30, 40, 50 和最大值 值为50

找到最大值的有效方法是什么?

@Edit :我刚刚找到了一个我不太确定的解决方案

ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(100); /* add(200), add(250) add(350) add(150) add(450)*/

Integer i = Collections.max(arrayList)

这会返回最大值。

另一种比较每个值的方法,例如selection sort or binary sort algorithm

【问题讨论】:

  • 您是否尝试过寻找价值?你在哪里卡住了?您自己的解决方案是否效率太低?
  • 如果它是你经常做的事情,Java 会将它编译成汇编,所以除非你做一些愚蠢的事情,否则你的代码只需要一个简单的迭代器就会非常高效。
  • @AnthonyPegram :我的意思是哪种排序算法或者java中有什么方法?顺便说一句,检查 gotomanners 的答案。
  • 对于可能包含null 值的数组:stackoverflow.com/questions/369383/…

标签: java


【解决方案1】:

您可以使用Collections API 轻松实现您想要的 - 高效阅读 - 足够了 Javadoc for Collections.max

Collections.max(arrayList);

根据元素的自然顺序返回给定集合的最大元素。集合中的所有元素都必须实现 Comparable 接口。

【讨论】:

  • 是的,遍历列表是O(n log(n)),但是如果“没有特别有效的方法”,除了全部检查之外,您认为这是一个更好的解决方案吗?
  • 天真的迭代比排序和获取第一个元素或使用最大值更快(检查,比较器从地图中获取分数)。 sort+take first 和 max 都使用了 lambda。
【解决方案2】:

它们有很多方法可以找到最大值。但是除非集合很大,否则性能不会有明显差异。

List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);

System.out.println(
        integers.stream().max(Integer::compare).get()
);
System.out.println(
        integers.stream().mapToInt(Integer::intValue).max().getAsInt()
);
System.out.println(
        integers.stream().max(Comparator.comparing(i -> i)).get()
);
System.out.println(
        integers.stream().reduce((a, b) -> a > b ? a : b).get()
);
System.out.println(
        integers.stream().reduce(Integer.MIN_VALUE, (a, b) -> a > b ? a : b)
);

max 方法需要 Comparator 作为参数。

reduce 方法需要 BinaryOperator 作为参数。

【讨论】:

    【解决方案3】:
    public int getMax(ArrayList list){
        int max = Integer.MIN_VALUE;
        for(int i=0; i<list.size(); i++){
            if(list.get(i) > max){
                max = list.get(i);
            }
        }
        return max;
    }
    

    据我了解,这基本上是 Collections.max() 所做的,尽管它们使用比较器,因为列表是通用的。

    【讨论】:

    • 对我来说这比其他任何事情都快。
    • @majTheHero 你的情况如何?不幸的是,如果不解释这一点,评论并没有多大用处。
    【解决方案4】:

    Comparator.comparing

    在 Java 8 中,集合已通过使用 lambda 得到增强。因此,使用Comparator.comparing 可以通过以下方式找到最大值和最小值:

    代码:

    List<Integer> ints = Stream.of(12, 72, 54, 83, 51).collect(Collectors.toList());
    System.out.println("the list: ");
    ints.forEach((i) -> {
        System.out.print(i + " ");
    });
    System.out.println("");
    Integer minNumber = ints.stream()
            .min(Comparator.comparing(i -> i)).get();
    Integer maxNumber = ints.stream()
            .max(Comparator.comparing(i -> i)).get();
    
    System.out.println("Min number is " + minNumber);
    System.out.println("Max number is " + maxNumber);
    

    输出:

     the list: 12 72 54 83 51  
     Min number is 12 
     Max number is 83
    

    【讨论】:

      【解决方案5】:

      这个问题已经差不多一年了,但我发现如果您为对象制作自定义比较器,则可以将 Collections.max 用于对象数组列表。

      import java.util.Comparator;
      
      public class compPopulation implements Comparator<Country> {
          public int compare(Country a, Country b) {
              if (a.getPopulation() > b.getPopulation())
                  return -1; // highest value first
              if (a.getPopulation() == b.Population())
                  return 0;
              return 1;
          }
      }
      ArrayList<Country> X = new ArrayList<Country>();
      // create some country objects and put in the list
      Country ZZ = Collections.max(X, new compPopulation());
      

      【讨论】:

      • 你需要一个日历类型的自定义比较器吗?
      • 您的代码返回列表中的最小值,如果 (a.getPopulation() > b.getPopulation()) return -1;上面必须更改为, if (a.getPopulation()
      • 这也可以使用 lambda 来完成:maxElement = Collections.max(collection, (el1, el2)-> el1 - el2);
      【解决方案6】:

      在 Java8 中

      arrayList.stream()
               .reduce(Integer::max)
               .get()
      

      【讨论】:

        【解决方案7】:
        model =list.stream().max(Comparator.comparing(Model::yourSortList)).get();
        

        【讨论】:

          【解决方案8】:

          Integer 类实现了 Comparable。因此我们可以很容易地得到 Integer 列表的最大值或最小值。

          public int maxOfNumList() {
              List<Integer> numList = new ArrayList<>();
              numList.add(1);
              numList.add(10);
              return Collections.max(numList);
          }
          

          如果一个类没有实现 Comparable 并且我们必须找到最大值和最小值,那么我们必须编写自己的 Comparator。

          List<MyObject> objList = new ArrayList<MyObject>();
          objList.add(object1);
          objList.add(object2);
          objList.add(object3);
          MyObject maxObject = Collections.max(objList, new Comparator<MyObject>() {
              @Override
              public int compare(MyObject o1, MyObject o2) {
                  if (o1.getValue() == o2.getValue()) {
                      return 0;
                  } else if (o1.getValue() > o2.getValue()) {
                      return -1;
                  } else if (o1.getValue() < o2.getValue()) {
                      return 1;
                  }
                  return 0;
              }
          });
          

          【讨论】:

            【解决方案9】:

            我们可以简单地使用Collections.max()Collections.min() 方法。

            public class MaxList {
                public static void main(String[] args) {
                    List l = new ArrayList();
                    l.add(1);
                    l.add(2);
                    l.add(3);
                    l.add(4);
                    l.add(5);
                    System.out.println(Collections.max(l)); // 5
                    System.out.println(Collections.min(l)); // 1
                }
            }
            

            【讨论】:

              【解决方案10】:

              Java 8

              由于整数是可比较的,我们可以使用以下一行:

              List<Integer> ints = Stream.of(22,44,11,66,33,55).collect(Collectors.toList());
              Integer max = ints.stream().mapToInt(i->i).max().orElseThrow(NoSuchElementException::new); //66
              Integer min = ints.stream().mapToInt(i->i).min().orElseThrow(NoSuchElementException::new); //11
              

              还有一点需要注意的是,我们不能使用Funtion.identity() 代替i-&gt;i,因为mapToInt 需要ToIntFunction,这是一个完全不同的接口,与Function 无关。而且这个接口只有一个方法applyAsInt,没有identity()方法。

              【讨论】:

                【解决方案11】:
                package in.co.largestinarraylist;
                
                import java.util.ArrayList;
                import java.util.Scanner;
                
                public class LargestInArrayList {
                
                    public static void main(String[] args) {
                
                        int n;
                        ArrayList<Integer> L = new ArrayList<Integer>();
                        int max;
                        Scanner in = new Scanner(System.in);
                        System.out.println("Enter Size of Array List");
                        n = in.nextInt();
                        System.out.println("Enter elements in Array List");
                
                        for (int i = 0; i < n; i++) {
                            L.add(in.nextInt());
                        }
                
                        max = L.get(0);
                
                        for (int i = 0; i < L.size(); i++) {
                            if (L.get(i) > max) {
                                max = L.get(i);
                            }
                        }
                
                        System.out.println("Max Element: " + max);
                        in.close();
                    }
                }
                

                【讨论】:

                  【解决方案12】:

                  除了gotomanners answer,万一其他人来这里寻找null safe解决同一问题的方法,这就是我最终得到的

                  Collections.max(arrayList, Comparator.nullsFirst(Comparator.naturalOrder()))
                  

                  【讨论】:

                    【解决方案13】:

                    这里有另外三种使用流在列表中查找最大值的方法:

                    List<Integer> nums = Arrays.asList(-1, 2, 1, 7, 3);
                    Optional<Integer> max1 = nums.stream().reduce(Integer::max);
                    Optional<Integer> max2 = nums.stream().max(Comparator.naturalOrder());
                    OptionalInt max3 = nums.stream().mapToInt(p->p).max();
                    System.out.println("max1: " + max1.get() + ", max2: " 
                       + max2.get() + ", max3: " + max3.getAsInt());
                    

                    所有这些方法,就像 Collections.max 一样,迭代整个集合,因此它们需要的时间与集合的大小成正比。

                    【讨论】:

                      【解决方案14】:

                      这里是函数

                      public int getIndexOfMax(ArrayList<Integer> arr){
                          int MaxVal = arr.get(0); // take first as MaxVal
                          int indexOfMax = -1; //returns -1 if all elements are equal
                          for (int i = 0; i < arr.size(); i++) {
                              //if current is less then MaxVal
                              if(arr.get(i) < MaxVal ){
                                  MaxVal = arr.get(i); // put it in MaxVal
                                  indexOfMax = i; // put index of current Max
                              }
                          }
                          return indexOfMax;  
                      }
                      

                      【讨论】:

                        【解决方案15】:

                        根据数组的大小,多线程解决方案也可能加快速度

                        【讨论】:

                        • 这听起来更像是评论,而不是问题的实际答案。
                        【解决方案16】:

                        没有特别有效的方法可以在未排序的列表中找到最大值——您只需要检查它们并返回最大值。

                        【讨论】:

                        • 这个整数 i = Collections.max(arrayList) 怎么样。无论我不是很确定,它都会返回在我的情况下的最高值。你说什么?
                        • @user1010399 - 这正是我所说的 - 它检查每个值并返回最高值。
                        • 好的,好的。谢谢。我对这个集合方法和排序算法有点困惑。
                        猜你喜欢
                        • 2015-11-11
                        • 2015-07-05
                        • 2018-05-06
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2020-03-29
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多