Itu sepele untuk menulis fungsi untuk menentukan nilai min / maks dalam array, seperti:
/**
*
* @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;
}
tetapi bukankah ini sudah dilakukan di suatu tempat?
java
arrays
algorithm
frameworks
Nick Heiner
sumber
sumber
Collections.max(Arrays.asList())
.Jawaban:
Menggunakan Commons Lang (untuk mengkonversi) + Koleksi (untuk minimum / maks)
Catatan yang
Arrays.asList()
membungkus array yang mendasarinya, jadi seharusnya tidak terlalu banyak memori dan tidak boleh melakukan salinan pada elemen-elemen array.sumber
ArrayUtils
Arrays.asList()
harus baik - baik saja, tetapiArrayUtils.toObject()
akan menyalin setiap elemena
ke array baruCharacter
.Arrays.asList(a)
tidak bekerja Anda tidak dapat membuat daftar primitif (List<char>
dalam hal ini). Pertama, Anda perlu mengkonversi nilai primitif ke objek dan itulah mengapaArrayUtils.toObject
digunakan.Anda hanya dapat menggunakan baru Java 8
Stream
s tetapi Anda harus bekerja denganint
.The
stream
metode kelas utilitasArrays
memberi AndaIntStream
yang dapat Anda menggunakanmin
metode. Anda juga dapat melakukanmax
,sum
,average
, ...The
getAsInt
metode yang digunakan untuk mendapatkan nilai dariOptionalInt
== UPDATE ==
Jika waktu eksekusi itu penting dan Anda ingin melalui data hanya sekali Anda dapat menggunakan
summaryStatistics()
metode seperti iniPendekatan ini dapat memberikan kinerja yang lebih baik daripada loop klasik karena
summaryStatistics
metode ini merupakan operasi reduksi dan memungkinkan paralelisasi.sumber
The Google Jambu perpustakaan memiliki min dan metode max di Chars nya, Ints, Longs, dll kelas.
Jadi Anda cukup menggunakan:
Tidak diperlukan konversi dan mungkin ini diterapkan secara efisien.
sumber
Ya, itu dilakukan di kelas Koleksi . Perhatikan bahwa Anda perlu mengonversi array char primitif Anda ke Karakter [] secara manual.
Demo singkat:
sumber
char []
menjadiCharacter []
hanya untuk menentukan maksimum cukup tidak efisien - lebih baik buat kelas utilitas dengan metode statis untuk setiap jenis primitif yang mirip denganjava.util.Arrays
: java.sun.com/javase/6/docs/api/java/util/Arrays.htmlCharacter.valueOf(chars[i])
alih-alihnew Character(chars[i])
karena alasan kinerja: java.sun.com/javase/6/docs/api/java/lang/…sumber
Saya memiliki kelas pembantu kecil di semua aplikasi saya dengan metode seperti:
sumber
Anda dapat dengan mudah melakukannya dengan
IntStream
danmax()
metode.Contoh
Penjelasan
range(0, intArray.length)
- Untuk mendapatkan aliran dengan elemen sebanyak yang ada diintArray
.map(i -> intArray[i])
- Peta setiap elemen aliran ke elemen aktualintArray
.max()
- Dapatkan elemen maksimum dari aliran ini sebagaiOptionalInt
.getAsInt()
- Buka bungkusnyaOptionalInt
. (Anda juga bisa menggunakan di siniorElse(0)
:, kalau-kalauOptionalInt
kosong.)sumber
Inilah kelas utilitas yang menyediakan
min/max
metode untuk tipe primitif: Primitives.javasumber
sumber
sumber
int
tetapi pertanyaannya adalah meminta nilaiint, long, char, byte....
Solusi dengan
reduce()
:Dalam kode di atas,
reduce()
mengembalikan data dalamOptional
format, yang dapat Anda konversiint
olehgetAsInt()
.Jika kami ingin membandingkan nilai maks dengan angka tertentu, kami dapat menetapkan nilai awal di
reduce()
:Dalam kode di atas, ketika
reduce()
dengan identitas (nilai awal) sebagai parameter pertama, itu mengembalikan data dalam format yang sama dengan identitas. Dengan properti ini, kami dapat menerapkan solusi ini ke array lain:sumber
Contoh dengan float:
sumber
Berikut ini adalah solusi untuk mendapatkan nilai maksimal di sekitar 99% proses (ubah 0,01 untuk mendapatkan hasil yang lebih baik):
(Tidak sepenuhnya serius)
sumber
Pass array ke metode yang mengurutkannya
Arrays.sort()
sehingga hanya mengurutkan array metode yang digunakan kemudian set min kearray[0]
dan maks kearray[array.length-1]
.sumber
Cara dasar untuk mendapatkan nilai min / max Array. Jika Anda membutuhkan array yang tidak disortir, Anda dapat membuat salinan atau meneruskannya ke metode yang mengembalikan min atau maks. Jika tidak, array yang diurutkan lebih baik karena kinerjanya lebih cepat dalam beberapa kasus.
sumber