159 votes

Comment obtenir la valeur maximale d'une collection (par exemple ArrayList) ?

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

Quelle est la méthode efficace pour 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 renvoie la valeur la plus élevée.

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

2 votes

Avez-vous essayé d'en trouver la valeur ? Où êtes-vous resté bloqué ? Votre propre solution est-elle peut-être trop inefficace ?

1 votes

Si c'est quelque chose que vous faites souvent, Java le compilera en assembleur, donc à moins que vous ne fassiez quelque chose de stupide, votre code sera assez efficace avec un simple itérateur.

0 votes

@AnthonyPegram : je veux dire quel algorithme de tri ou y a-t-il une méthode en java ? BTW vérifiez la réponse de gotomanners.

343voto

gotomanners Points 2707

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

Collections.max(arrayList);

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

1 votes

Oui, itérer dans la liste est O(n log(n)) mais si "Il n'y a pas de moyen particulièrement efficace", que proposez-vous comme meilleure solution à part les vérifier tous ?

0 votes

L'itération naïve est plus rapide (vérifié, le comparateur récupérait les scores d'une Map) que le tri et l'obtention du premier élément ou l'utilisation de max. Tant sort+prendre le premier élément que max utilisent un lambda.

33voto

Robert Quinn Points 129

Cette question date de presque un an, mais j'ai découvert que si vous créez un comparateur personnalisé pour les objets, vous pouvez utiliser Collections.max pour une liste de tableaux 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());

0 votes

Avez-vous besoin d'un comparateur personnalisé pour les types de calendrier ?

0 votes

Votre code renvoie la plus petite valeur de la liste, if (a.getPopulation() > b.getPopulation()) return -1 ; Ce qui précède doit être changé en, if (a.getPopulation() < b.getPopulation()) return -1 ; // la plus grande valeur en premier

0 votes

Cela peut également être fait en utilisant un lambda : maxElement = Collections.max(collection, (el1, el2)-> el1 - el2) ;

28voto

John Points 41
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;
}

D'après ce que j'ai compris, c'est essentiellement ce que fait Collections.max(), bien qu'ils utilisent un comparateur puisque les listes sont génériques.

1 votes

C'est plus rapide que tout le reste pour mon cas.

15voto

Bhavin Shah Points 111

Nous pouvons simplement utiliser Collections.max() et Collections.min() méthode.

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

5voto

Brendan Long Points 24372

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

0 votes

Qu'en est-il de ce nombre entier i = Collections.max(arrayList) . il renvoie la valeur la plus élevée dans mon cas si je ne suis pas très sûr. que dites-vous ?

0 votes

@user1010399 - Ceci fait exactement ce que je dis -- Il vérifie chaque valeur et retourne la plus élevée.

0 votes

Ok, ok. Merci. J'étais un peu confus entre cette méthode de collecte et l'algorithme de tri.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X