Existe um ArrayList que armazena valores inteiros. Preciso encontrar o valor máximo nesta lista. Por exemplo, suponha que os valores armazenados do arrayList sejam: 10, 20, 30, 40, 50
e o valor máximo seria 50
.
Qual é a maneira eficiente de encontrar o valor máximo?
@ Edit: Acabei de encontrar uma solução para a qual não tenho muita certeza
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(100); /* add(200), add(250) add(350) add(150) add(450)*/
Integer i = Collections.max(arrayList)
e isso retorna o valor mais alto.
Outra maneira de comparar cada valor, por exemplo selection sort or binary sort algorithm
null
valores: stackoverflow.com/questions/369383/...Respostas:
Você pode usar o
Collections API
para obter o que deseja facilmente - leia com eficiência - Javadoc suficiente para Collections.maxfonte
O(n log(n))
mas se "Não existe uma maneira particularmente eficiente", o que você propõe que seja uma solução melhor além de verificar todas elas?Esta pergunta tem quase um ano, mas descobri que, se você fizer um comparador personalizado para objetos, poderá usar o Collections.max para uma lista de objetos da matriz.
fonte
Pelo que entendi, é basicamente o que o Collections.max () faz, embora eles usem um comparador, pois as listas são genéricas.
fonte
Nós podemos simplesmente usar
Collections.max()
eCollections.min()
método.fonte
A classe inteira implementa Comparable. Assim, podemos obter facilmente o valor máximo ou mínimo da lista Inteiro.
Se uma classe não implementa Comparable e temos que encontrar os valores max e min, precisamos escrever nosso próprio Comparator.
fonte
Comparator.comparing
No Java 8, as coleções foram aprimoradas usando lambda. Portanto, encontrar max e min pode ser realizado da seguinte maneira, usando
Comparator.comparing
:Código:
Resultado:
fonte
Não existe uma maneira particularmente eficiente de encontrar o valor máximo em uma lista não classificada - basta verificar todos eles e retornar o valor mais alto.
fonte
i = Collections.max(arrayList)
? retorna o valor mais alto no meu caso, se não tenho muita certeza. o que você diz?Aqui estão mais três maneiras de encontrar o valor máximo em uma lista, usando fluxos:
Todos esses métodos, assim como
Collections.max
, repetem a coleção inteira, portanto, requerem tempo proporcional ao tamanho da coleção.fonte
Java 8
Como os números inteiros são comparáveis, podemos usar o seguinte liner em:
Outro ponto a ser observado é que não podemos usar
Funtion.identity()
no lugar dei->i
comomapToInt
esperado,ToIntFunction
que é uma interface completamente diferente e não está relacionada aFunction
. Além disso, essa interface possui apenas um métodoapplyAsInt
e nenhumidentity()
método.fonte
Aqui está a fucntion
fonte
fonte
Além da resposta de gotomanners , caso outras pessoas venham aqui procurando uma solução nula e segura para o mesmo problema, foi com isso que acabei
fonte
Em Java8
fonte
fonte
dependendo do tamanho da sua matriz, uma solução multithread também pode acelerar as coisas
fonte