web-dev-qa-db-fra.com

Comment obtenir le maximum de valeur de la collection (par exemple, ArrayList)?

Il existe une ArrayList qui stocke des valeurs entières. Je dois trouver la valeur maximale dans cette liste. Par exemple. supposons que les valeurs stockées dans arrayList sont: 10, 20, 30, 40, 50 et que la valeur maximale serait 50.

Quel est le moyen efficace de trouver la valeur maximale?

@ Edit: Je viens de trouver une solution pour laquelle je ne suis pas très sûr

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

Integer i = Collections.max(arrayList)

et cela retourne la valeur la plus élevée.

Une autre façon de comparer chaque valeur, par ex. selection sort or binary sort algorithm

117
user1010399

Vous pouvez utiliser le Collections API pour réaliser facilement ce que vous voulez - lire efficacement - assez Javadoc pour Collections.max

Collections.max(arrayList);

Renvoie l'élément maximum de la collection donnée, en fonction de l'ordre naturel de ses éléments. Tous les éléments de la collection doivent implémenter l'interface Comparable.

261
gotomanners

Cette question a presque un an, mais j’ai constaté que si vous créez un comparateur personnalisé pour les objets, vous pouvez utiliser Collections.max pour une liste d’objets.

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

A ma connaissance, c'est ce que fait Collections.max (), bien qu'ils utilisent un comparateur car les listes sont génériques.

18
John

Nous pouvons simplement utiliser la méthode Collections.max() et 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
    }
}
13
Bhavin Shah

_Comparator.comparing_

Dans Java 8, les collections ont été améliorées à l'aide de lambda. Donc, trouver max et min peut être accompli comme suit, en utilisant Comparator.comparing :

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

Sortie:

_ the list: 12 72 54 83 51  
 Min number is 12 
 Max number is 83
_
7
Kick Buttowski

La classe Integer implémente Comparable. Nous pouvons donc facilement obtenir la valeur max ou min de la liste Integer.

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

Si une classe n'implémente pas Comparable et que nous devons trouver les valeurs max et min, nous devons écrire notre propre comparateur.

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;
    }
});
6
Avijit Karmakar

Il n'y a pas de moyen particulièrement efficace de trouver la valeur maximale dans une liste non triée - il vous suffit de toutes les vérifier et de renvoyer la valeur la plus élevée.

5
Brendan Long

Voici trois autres moyens de rechercher la valeur maximale dans une liste à l'aide de flux:

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

Toutes ces méthodes, comme Collections.max, parcourent l'ensemble de la collection et nécessitent donc un temps proportionnel à la taille de la collection.

4
Ida Bucić

Java 8

Comme les entiers sont comparables, nous pouvons utiliser la doublure suivante:

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

Un autre point à noter est que nous ne pouvons pas utiliser Funtion.identity() à la place de i->i comme mapToInt s'attend à ToIntFunction qui est une interface complètement différente et n'est pas liée à Function. De plus, cette interface n'a qu'une méthode applyAsInt et aucune méthode identity().

3
i_am_zero

En plus de réponse de gotomanners , si quelqu'un d'autre venait ici chercher une solution null safe au même problème, il s'agit du ce que j'ai fini avec

Collections.max(arrayList, Comparator.nullsFirst(Comparator.naturalOrder()))
1
Chris Dons Johansen

Voici la fonction

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;  
}
1
SAM
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();
    }
}
1
Tarun Jadhav

En Java8

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