Es ist trivial, eine Funktion zu schreiben, um den Min / Max-Wert in einem Array zu bestimmen, wie zum Beispiel:
/**
*
* @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;
}
aber ist das nicht schon irgendwo gemacht?
java
arrays
algorithm
frameworks
Nick Heiner
quelle
quelle
Collections.max(Arrays.asList())
.Antworten:
Verwenden von Commons Lang (zum Konvertieren) + Sammlungen (zu min / max)
Beachten Sie, dass
Arrays.asList()
das zugrunde liegende Array umbrochen wird, damit es nicht zu speicherintensiv ist und keine Kopie der Elemente des Arrays erstellt wird.quelle
ArrayUtils
Arrays.asList()
sollte in Ordnung sein,ArrayUtils.toObject()
kopiert aber jedes Element vona
in ein neues Array vonCharacter
.Arrays.asList(a)
funktioniert nicht Sie können (List<char>
in diesem Fall) keine Liste von Grundelementen erstellen. Zuerst müssen Sie die primitiven Werte in Objekte konvertieren und deshalbArrayUtils.toObject
wird sie verwendet.Sie können einfach die neue Java 8 verwenden
Stream
s , aber Sie müssen die Arbeit mitint
.Die
stream
Methode der Utility-KlasseArrays
gibt Ihnen eine,IntStream
für die Sie diemin
Methode verwenden können. Sie können auch tunmax
,sum
,average
, ...Die
getAsInt
Methode wird verwendet, um den Wert von der zu erhaltenOptionalInt
== UPDATE ==
Wenn die Ausführungszeit wichtig ist und Sie die Daten nur einmal durchgehen möchten, können Sie die
summaryStatistics()
Methode wie folgt verwendenDieser Ansatz kann eine bessere Leistung als die klassische Schleife liefern, da die
summaryStatistics
Methode eine Reduktionsoperation ist und eine Parallelisierung ermöglicht.quelle
Die Google Guava-Bibliothek verfügt über Min- und Max-Methoden in den Klassen Chars, Ints, Longs usw.
Sie können also einfach Folgendes verwenden:
Es sind keine Konvertierungen erforderlich und vermutlich wird es effizient implementiert.
quelle
Ja, es wird in den Sammlungen gemacht Klasse durchgeführt. Beachten Sie, dass Sie Ihr primitives Zeichenarray manuell in ein Zeichen [] konvertieren müssen.
Eine kurze Demo:
quelle
char []
in aCharacter []
only, um das Maximum zu bestimmen, ist ziemlich ineffizient. Erstellen Sie besser eine Dienstprogrammklasse mit statischen Methoden für jeden primitiven Typ, ähnlich wiejava.util.Arrays
: java.sun.com/javase/6/docs/api/java/util/Arrays.htmlCharacter.valueOf(chars[i])
anstelle vonnew Character(chars[i])
aus Leistungsgründen verwenden: java.sun.com/javase/6/docs/api/java/lang/…quelle
Ich habe in all meinen Anwendungen eine kleine Hilfsklasse mit Methoden wie:
quelle
Sie könnten es leicht mit einem
IntStream
und dermax()
Methode tun .Beispiel
Erläuterung
range(0, intArray.length)
- Um einen Stream mit so vielen Elementen wie möglich in der zu erhaltenintArray
.map(i -> intArray[i])
- Ordnen Sie jedes Element des Streams einem tatsächlichen Element des Streams zuintArray
.max()
- Holen Sie sich das maximale Element dieses Streams alsOptionalInt
.getAsInt()
- Packen Sie die ausOptionalInt
. (Sie können auch hier verwenden :orElse(0)
, nur für den Fall, dass dasOptionalInt
leer ist.)quelle
Hier ist eine Dienstprogrammklasse, die
min/max
Methoden für primitive Typen bereitstellt : Primitives.javaquelle
quelle
quelle
int
aber die Frage fragt nach primitiven Wertenint, long, char, byte....
Eine Lösung mit
reduce()
:In dem obigen Code,
reduce()
liefert Daten inOptional
Format, das Sie konvertieren könnenint
durchgetAsInt()
.Wenn wir den Maximalwert mit einer bestimmten Zahl vergleichen möchten, können wir einen Startwert festlegen in
reduce()
:Wenn im obigen Code
reduce()
eine Identität (Startwert) als erster Parameter verwendet wird, werden Daten im gleichen Format wie die Identität zurückgegeben. Mit dieser Eigenschaft können wir diese Lösung auf andere Arrays anwenden:quelle
Beispiel mit float:
quelle
Hier ist eine Lösung, um den Maximalwert in etwa 99% der Läufe zu erhalten (ändern Sie die 0,01, um ein besseres Ergebnis zu erzielen):
(Nicht ganz ernst)
quelle
Übergeben Sie das Array an eine Methode, mit der
Arrays.sort()
es sortiert wird, sodass nur das von der Methode verwendete Array sortiert wird, und setzen Sie dann min aufarray[0]
und max aufarray[array.length-1]
.quelle
Der grundlegende Weg, um den Min / Max-Wert eines Arrays zu erhalten. Wenn Sie das unsortierte Array benötigen, können Sie eine Kopie erstellen oder an eine Methode übergeben, die min oder max zurückgibt. Wenn nicht, ist das sortierte Array besser, da es in einigen Fällen schneller arbeitet.
quelle