Pisanie funkcji określającej wartość min / max w tablicy jest trywialne, na przykład:
/**
*
* @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;
}
ale czy to już gdzieś nie zostało zrobione?
java
arrays
algorithm
frameworks
Nick Heiner
źródło
źródło
Collections.max(Arrays.asList())
.Odpowiedzi:
Korzystanie z Commons Lang (do konwersji) + Kolekcje (do min / maks)
Zauważ, że
Arrays.asList()
otacza podstawową tablicę, więc nie powinna być zbyt obciążająca pamięć i nie powinna wykonywać kopii na elementach tablicy.źródło
ArrayUtils
Arrays.asList()
powinno być w porządku, aleArrayUtils.toObject()
skopiuje każdy elementa
do nowej tablicyCharacter
.Arrays.asList(a)
nie działa Nie możesz zrobić listy prymitywów (List<char>
w tym przypadku). Najpierw musisz przekonwertować pierwotne wartości na obiekty i dlategoArrayUtils.toObject
jest używany.Można po prostu skorzystać z nowych Java 8
Stream
s , ale trzeba pracować zint
.stream
Metoda klasie użytkowejArrays
dajeIntStream
na których można użyćmin
metody. Można również zrobićmax
,sum
,average
, ...Ta
getAsInt
metoda służy do uzyskania wartości zOptionalInt
== AKTUALIZACJA ==
Jeśli czas wykonania jest ważny i chcesz przejrzeć dane tylko raz, możesz użyć takiej
summaryStatistics()
metodyTakie podejście może dać lepszą wydajność niż klasyczna pętla, ponieważ
summaryStatistics
metoda jest operacją redukcji i umożliwia równoległość.źródło
Biblioteka Google Guava ma metody min i max w swoich klasach Chars, Ints, Longs itp.
Możesz więc po prostu użyć:
Nie są wymagane żadne konwersje i prawdopodobnie jest to skutecznie wdrożone.
źródło
Tak, odbywa się to w klasie Kolekcje . Zauważ, że będziesz musiał ręcznie przekonwertować pierwotną tablicę znaków na znak [].
Krótkie demo:
źródło
char []
naCharacter []
jedyną w celu ustalenia maksimum jest dość nieefektywna - lepiej utwórz klasę narzędziową z metodami statycznymi dla każdego typu pierwotnego podobnego dojava.util.Arrays
: java.sun.com/javase/6/docs/api/java/util/Arrays.htmlCharacter.valueOf(chars[i])
zamiast ze względunew Character(chars[i])
na wydajność: java.sun.com/javase/6/docs/api/java/lang/…źródło
Mam małą klasę pomocników we wszystkich moich aplikacjach z metodami takimi jak:
źródło
Można łatwo zrobić ze związkiem
IntStream
i tymmax()
sposobem.Przykład
Wyjaśnienie
range(0, intArray.length)
- Aby uzyskać strumień z tyloma elementami, ile jest obecnych wintArray
.map(i -> intArray[i])
- Mapuj każdy element strumienia do rzeczywistego elementuintArray
.max()
- Uzyskaj maksymalny element tego strumienia jakoOptionalInt
.getAsInt()
- RozpakujOptionalInt
. (Możesz także użyć tutaj:orElse(0)
na wypadek, gdybyOptionalInt
był pusty.)źródło
Oto klasa narzędzi zapewniająca
min/max
metody dla typów pierwotnych: Primitive.javaźródło
źródło
źródło
int
ale pytanie dotyczy prymitywnych wartościint, long, char, byte....
Rozwiązanie z
reduce()
:W powyższym kodzie,
reduce()
zwraca dane wOptional
formacie, który można przekonwertować doint
ogetAsInt()
.Jeśli chcemy porównać wartość maksymalną z określoną liczbą, możemy ustawić wartość początkową w
reduce()
:W powyższym kodzie, gdy
reduce()
z tożsamością (wartością początkową) jako pierwszym parametrem, zwraca dane w tym samym formacie z tożsamością. Dzięki tej właściwości możemy zastosować to rozwiązanie do innych tablic:źródło
Przykład z pływakiem:
źródło
Oto rozwiązanie, aby uzyskać maksymalną wartość w około 99% przebiegów (zmień 0,01, aby uzyskać lepszy wynik):
(Nie do końca poważny)
źródło
Przepuścić tablicę do metody, która z rodzaju IT
Arrays.sort()
więc tylko sortowanie tablicy sposób używa ustawia min doarray[0]
i maksymalnie doarray[array.length-1]
.źródło
Podstawowy sposób uzyskania wartości min / max tablicy. Jeśli potrzebujesz nieposortowanej tablicy, możesz utworzyć kopię lub przekazać ją do metody, która zwraca min lub max. Jeśli nie, posortowana tablica jest lepsza, ponieważ w niektórych przypadkach działa szybciej.
źródło