É trivial escrever uma função para determinar o valor mínimo / máximo em uma matriz, como:
/**
*
* @param chars
* @return the max value in the array of chars
*/
private static int maxValue(char[] chars) {
int max = chars[0];
for (int ktr = 0; ktr < chars.length; ktr++) {
if (chars[ktr] > max) {
max = chars[ktr];
}
}
return max;
}
mas isso já não foi feito em algum lugar?
java
arrays
algorithm
frameworks
Nick Heiner
fonte
fonte
Collections.max(Arrays.asList())
.Respostas:
Usando o Commons Lang (para converter) + Coleções (para min / max)
Observe que
Arrays.asList()
agrupa a matriz subjacente; portanto, ela não deve consumir muita memória e não deve executar uma cópia nos elementos da matriz.fonte
ArrayUtils
Arrays.asList()
deve ficar bem, masArrayUtils.toObject()
copiará cada elemento dea
para uma nova matriz deCharacter
.Arrays.asList(a)
não funciona Você não pode fazer uma lista de primitivas (List<char>
neste caso). Primeiro você precisa converter os valores primitivos em objetos e é por isso queArrayUtils.toObject
é usado.Você pode simplesmente usar as novas Java 8
Stream
s mas você tem que trabalhar comint
.O
stream
método da classe de utilitárioArrays
fornece um métodoIntStream
no qual você pode usar omin
método. Você também pode fazermax
,sum
,average
, ...O
getAsInt
método é usado para obter o valor doOptionalInt
== ATUALIZAÇÃO ==
Se o tempo de execução for importante e você desejar analisar os dados apenas uma vez, poderá usar o
summaryStatistics()
método como esteEssa abordagem pode oferecer um desempenho melhor que o loop clássico, porque o
summaryStatistics
método é uma operação de redução e permite paralelização.fonte
A biblioteca do Google Guava possui métodos min e max em suas classes Chars, Ints, Longs etc.
Então você pode simplesmente usar:
Nenhuma conversão é necessária e, presumivelmente, é implementada com eficiência.
fonte
Sim, é feito na classe Coleções . Observe que você precisará converter sua matriz de caracteres primitiva em um caractere [] manualmente.
Uma breve demonstração:
fonte
char []
paraCharacter []
apenas para determinar o máximo é bastante ineficiente - crie melhor uma classe de utilitário com métodos estáticos para cada tipo primitivo semelhante ajava.util.Arrays
: java.sun.com/javase/6/docs/api/java/util/Arrays.htmlCharacter.valueOf(chars[i])
vez denew Character(chars[i])
por motivos de desempenho: java.sun.com/javase/6/docs/api/java/lang/…fonte
Eu tenho uma pequena classe auxiliar em todos os meus aplicativos com métodos como:
fonte
Você poderia facilmente fazê-lo com um
IntStream
eomax()
método.Exemplo
Explicação
range(0, intArray.length)
- Para obter um fluxo com tantos elementos quanto presentes nointArray
.map(i -> intArray[i])
- Mapeie todos os elementos do fluxo para um elemento real dointArray
.max()
- Obtenha o elemento máximo desse fluxo comoOptionalInt
.getAsInt()
- Desembrulhe oOptionalInt
. (Você também pode usar aqui:orElse(0)
casoOptionalInt
esteja vazio.)fonte
Aqui está uma classe de utilitário que fornece
min/max
métodos para tipos primitivos: Primitives.javafonte
fonte
fonte
int
, mas a questão está pedindo valores primitivosint, long, char, byte....
Uma solução com
reduce()
:No código acima,
reduce()
retorna dados noOptional
formato, que você pode converter emint
pelogetAsInt()
.Se quisermos comparar o valor máximo com um determinado número, podemos definir um valor inicial em
reduce()
:No código acima, quando
reduce()
com uma identidade (valor inicial) como o primeiro parâmetro, ele retorna dados no mesmo formato que a identidade. Com essa propriedade, podemos aplicar esta solução a outras matrizes:fonte
Exemplo com float:
fonte
Aqui está uma solução para obter o valor máximo em cerca de 99% das execuções (altere 0,01 para obter um resultado melhor):
(Não é completamente sério)
fonte
Passe a matriz para um método que a classifique,
Arrays.sort()
para classificar apenas a matriz que o método está usando e, em seguida, define min paraarray[0]
e max paraarray[array.length-1]
.fonte
A maneira básica de obter o valor mínimo / máximo de uma matriz. Se você precisar da matriz não classificada, poderá criar uma cópia ou passá-la para um método que retorne o mínimo ou o máximo. Caso contrário, a matriz classificada é melhor, pois ela executa mais rapidamente em alguns casos.
fonte