cómo obtener el máximo valor de List / ArrayList

Hay una ArrayList que almacena valores enteros. Necesito encontrar el valor máximo en esta lista. Por ejemplo, supongamos que los valores almacenados de la lista de arreglos son: 10, 20, 30, 40, 50 y el valor máximo sería 50 .

¿Cuál es la forma más eficiente de encontrar el valor máximo?

@Edit: Acabo de encontrar una solución para la que no estoy muy seguro

 ArrayList arrayList = new ArrayList(); arrayList.add(100); /* add(200), add(250) add(350) add(150) add(450)*/ Integer i = Collections.max(arrayList) 

y esto devuelve el valor más alto.

Otra forma de comparar cada valor, por ejemplo, la selection sort or binary sort algorithm por selection sort or binary sort algorithm

Puede usar la Collections API para lograr lo que quiere fácilmente, leer de manera eficiente , suficiente Javadoc para Collections.max

 Collections.max(arrayList); 

Devuelve el elemento máximo de la colección dada, de acuerdo con el orden natural de sus elementos. Todos los elementos en la colección deben implementar la interfaz Comparable.

Esta pregunta tiene casi un año, pero descubrí que si crea un comparador personalizado para objetos, puede usar Collections.max para una lista de objetos.

 import java.util.Comparator; public class compPopulation implements Comparator { 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 X = new ArrayList(); // 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 max){ max = list.get(i); } } return max; } 

Desde mi entendimiento, esto es básicamente lo que hace Collections.max (), aunque usan un comparador ya que las listas son genéricas.

Simplemente podemos usar el método Collections.max() y 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 } } 

No hay una manera particularmente eficiente de encontrar el valor máximo en una lista desordenada; solo tiene que verificarlos todos y devolver el valor más alto.

En Java 8, las colecciones se han mejorado mediante el uso de lambda, por lo que encontrar max y min se puede lograr de la siguiente manera.

Código:

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

Salida:

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

La clase entera implementa Comparable. Así que podemos obtener fácilmente el valor máximo o mínimo de la lista de enteros.

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

Si una clase no implementa Comparable y tenemos que encontrar el valor máximo y mínimo, entonces tenemos que escribir nuestro propio Comparador.

 List objList = new ArrayList(); objList.add(object1); objList.add(object2); objList.add(object3); MyObject maxObject = Collections.max(objList, new Comparator() { @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; } }); 

Aquí hay tres formas más de encontrar el valor máximo en una lista, usando transmisiones:

 List nums = Arrays.asList(-1, 2, 1, 7, 3); Optional max1 = nums.stream().reduce(Integer::max); Optional 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()); 

Todos estos métodos, al igual que Collections.max , se repiten en toda la colección, por lo tanto, requieren un tiempo proporcional al tamaño de la colección.

Aquí está la frase

 public int getIndexOfMax(ArrayList 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 L = new ArrayList(); 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(); } } 

Además de la respuesta gotomanners , en caso de que alguien más viniera aquí en busca de una solución nula segura para el mismo problema, esto es a lo que terminé con

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

Dependiendo del tamaño de su matriz, una solución multiproceso también puede acelerar las cosas