简体   繁体   English

如何从集合中获取最大值(例如 ArrayList)?

[英]How to get maximum value from the Collection (for example ArrayList)?

There is an ArrayList which stores integer values.有一个 ArrayList 存储整数值。 I need to find the maximum value in this list.我需要在这个列表中找到最大值。 Eg suppose the arrayList stored values are : 10, 20, 30, 40, 50<\/code> and the max value would be 50<\/code> .例如,假设 arrayList 存储的值为: 10, 20, 30, 40, 50<\/code>最大值为50<\/code> 。

What is the efficient way to find the maximum value?找到最大值的有效方法是什么?

@Edit :<\/em><\/strong> I just found one solution for which I am not very sure @Edit:<\/em><\/strong>我刚刚找到了一个我不太确定的解决方案

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

Integer i = Collections.max(arrayList)

You can use the Collections API to achieve what you want easily - read efficiently - enough Javadoc for Collections.max 您可以使用Collections API轻松实现您想要的 - 有效读取 - 足够的Javadoc for Collections.max

Collections.max(arrayList);

Returns the maximum element of the given collection, according to the natural ordering of its elements. 根据元素的自然顺序返回给定集合的最大元素。 All elements in the collection must implement the Comparable interface. 集合中的所有元素都必须实现Comparable接口。

This question is almost a year old but I have found that if you make a custom comparator for objects you can use Collections.max for an array list of objects. 这个问题差不多用了一年,但我发现如果你为对象创建一个自定义比较器,你可以使用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());
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;
}

From my understanding, this is basically what Collections.max() does, though they use a comparator since lists are generic. 根据我的理解,这基本上是Collections.max()所做的,尽管它们使用比较器,因为列表是通用的。

We can simply use Collections.max() and Collections.min() method. 我们可以简单地使用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
    }
}

Comparator.comparing

In Java 8, Collections have been enhanced by using lambda. 在Java 8中,使用lambda增强了集合。 So finding max and min can be accomplished as follows, using Comparator.comparing : 因此,使用Comparator.comparing可以如下完成查找max和min:

Code: 码:

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

Output: 输出:

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

Integer class implements Comparable.So we can easily get the max or min value of the Integer list. Integer类实现Comparable.So我们可以轻松获取Integer列表的最大值或最小值。

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

If a class does not implements Comparable and we have to find max and min value then we have to write our own Comparator. 如果一个类没有实现Comparable,我们必须找到max和min值,那么我们必须编写自己的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;
    }
});

没有特别有效的方法来查找未排序列表中的最大值 - 您只需要检查它们并返回最高值。

Here are three more ways to find the maximum value in a list, using streams: 以下是使用流来查找列表中最大值的另外三种方法:

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

All of these methods, just like Collections.max , iterate over the entire collection, hence they require time proportional to the size of the collection. 所有这些方法,就像Collections.max一样,遍历整个集合,因此它们需要与集合大小成比例的时间。

Java 8 Java 8

As integers are comparable we can use the following one liner in: 由于整数可比,我们可以使用以下一个班轮:

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

Another point to note is we cannot use Funtion.identity() in place of i->i as mapToInt expects ToIntFunction which is a completely different interface and is not related to Function . 需要注意的另一点是我们不能使用Funtion.identity()代替i->i因为mapToInt需要ToIntFunction ,这是一个完全不同的接口,与Function无关。 Moreover this interface has only one method applyAsInt and no identity() method. 而且这个接口只有一个方法applyAsInt而且没有identity()方法。

Here is the fucntion 这是功能

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

除了gotomanners的答案 ,如果有人来到这里寻找同样问题的空安全解决方案,这就是我最终的结果

Collections.max(arrayList, Comparator.nullsFirst(Comparator.naturalOrder()))
model =list.stream().max(Comparator.comparing(Model::yourSortList)).get();

In Java8 在Java8中

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

They're many ways to find the maximum.他们有很多方法可以找到最大值。 But there will be no noticeable difference in performance unless the collection is huge.但是除非集合很大,否则性能不会有明显差异。

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM