L's banal de a scrie o funcție pentru a determina min/max valoare într-o matrice, cum ar fi:
/**
*
* @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;
}
dar nu't acest lucru deja făcut undeva?
Folosind Commons Lang (pentru a converti) + Colecții (min/max)
import java.util.Arrays;
import java.util.Collections;
import org.apache.commons.lang.ArrayUtils;
public class MinMaxValue {
public static void main(String[] args) {
char[] a = {'3', '5', '1', '4', '2'};
List b = Arrays.asList(ArrayUtils.toObject(a));
System.out.println(Collections.min(b));
System.out.println(Collections.max(b));
}
}
Notă: în Tablouri.asList()` împachetări cu bază largă, așa că nu trebuie să fie prea intensiv de memorie și nu ar trebui să efectuați o copie de pe elementele de matrice.
Puteți folosi pur și simplu noul Java 8 `de curent dar trebuie să lucreze cu int
.
A flux
metoda de utilitate clasa Tablouri
vă oferă o IntStream
pe care le puteți utiliza min
metodă. Puteți face, de asemenea, max
, suma
, mediu,...
A getAsInt
metodă este folosită pentru a obține valoarea de la OptionalInt
import java.util.Arrays;
public class Test {
public static void main(String[] args){
int[] tab = {12, 1, 21, 8};
int min = Arrays.stream(tab).min().getAsInt();
int max = Arrays.stream(tab).max().getAsInt();
System.out.println("Min = " + min);
System.out.println("Max = " + max)
}
}
==ACTUALIZARE==
Dacă timpul de executie este important și vrei să mergi prin datele numai o singură dată, puteți utiliza summaryStatistics()
metoda astfel de prognoze
import java.util.Arrays;
import java.util.IntSummaryStatistics;
public class SOTest {
public static void main(String[] args){
int[] tab = {12, 1, 21, 8};
IntSummaryStatistics stat = Arrays.stream(tab).summaryStatistics();
int min = stat.getMin();
int max = stat.getMax();
System.out.println("Min = " + min);
System.out.println("Max = " + max);
}
}
Această abordare poate oferi o performanță mai bună decât clasica buclă pentru că summaryStatistics
metoda este o operatie de reducere a](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Reduction) și permite paralelizare.
Google Guava biblioteca a min și max metode în Char, Int, Tânjește, etc. clase.
Deci, puteți folosi pur și simplu:
Chars.min(myarray)
Nu conversii sunt necesare și, probabil, l's implementate eficient.
Da, l's face în Colecții clasă. Rețineți că veți avea nevoie pentru a converti primitiv char array de la un Personaj[] manual.
Un demo scurt:
import java.util.*;
public class Main {
public static Character[] convert(char[] chars) {
Character[] copy = new Character[chars.length];
for(int i = 0; i < copy.length; i++) {
copy[i] = Character.valueOf(chars[i]);
}
return copy;
}
public static void main(String[] args) {
char[] a = {'3', '5', '1', '4', '2'};
Character[] b = convert(a);
System.out.println(Collections.max(Arrays.asList(b)));
}
}
import java.util.Arrays;
public class apples {
public static void main(String[] args) {
int a[] = {2,5,3,7,8};
Arrays.sort(a);
int min =a[0];
System.out.println(min);
int max= a[a.length-1];
System.out.println(max);
}
}
Am si eu o mica helper class în toate aplicațiile mele cu metode cum ar fi:
public static double arrayMax(double[] arr) {
double max = Double.NEGATIVE_INFINITY;
for(double cur: arr)
max = Math.max(max, cur);
return max;
}
Ai putea face cu ușurință cu o `IntStream " și " max () metodă.
public static int maxValue(final int[] intArray) {
return IntStream.range(0, intArray.length).map(i -> intArray[i]).max().getAsInt();
}
range(0, intArray.lungimea)- Pentru a obține un flux cu cât mai multe elemente prezente în
intArray`.
harta lui(i -> intArray[i])- Harta fiecare element de flux de la un real element de intArray
.
max()- Ia elementul maxim din acest flux ca
OptionalInt`.
getAsInt()
- Desfă OptionalInt
. (Ai putea folosi, de asemenea, aici: altfel(0)
, doar în cazul în care OptionalInt
este gol.)
O soluție cu reduce()
:
int[] array = {23, 3, 56, 97, 42};
// directly print out
Arrays.stream(array).reduce((x, y) -> x > y ? x : y).ifPresent(System.out::println);
// get the result as an int
int res = Arrays.stream(array).reduce((x, y) -> x > y ? x : y).getAsInt();
System.out.println(res);
>>
97
97
În codul de mai sus, reduce()returnează datele în "Opțional" format, pe care le puteți converti la
int " cu " getAsInt()`.
Dacă vrem să comparăm valoarea maximă cu un anumit număr, putem seta o valoare de start în reduce()
:
int[] array = {23, 3, 56, 97, 42};
// e.g., compare with 100
int max = Arrays.stream(array).reduce(100, (x, y) -> x > y ? x : y);
System.out.println(max);
>>
100
În codul de mai sus, atunci când se reduce()` cu o identitate (valoare de start) ca primul parametru, se întoarce de date în același format cu identitatea. Cu această proprietate, putem aplica această soluție la alte tablouri:
double[] array = {23.1, 3, 56.6, 97, 42};
double max = Arrays.stream(array).reduce(array[0], (x, y) -> x > y ? x : y);
System.out.println(max);
>>
97.0
import java.util.Random;
public class Main {
public static void main(String[] args) {
int a[] = new int [100];
Random rnd = new Random ();
for (int i = 0; i< a.length; i++) {
a[i] = rnd.nextInt(99-0)+0;
System.out.println(a[i]);
}
int max = 0;
for (int i = 0; i < a.length; i++) {
a[i] = max;
for (int j = i+1; j<a.length; j++) {
if (a[j] > max) {
max = a[j];
}
}
}
System.out.println("Max element: " + max);
}
}
Exemplu cu float:
public static float getMaxFloat(float[] data) {
float[] copy = Arrays.copyOf(data, data.length);
Arrays.sort(copy);
return copy[data.length - 1];
}
public static float getMinFloat(float[] data) {
float[] copy = Arrays.copyOf(data, data.length);
Arrays.sort(copy);
return copy[0];
}
Aici este o soluție pentru a obține valoarea maximă în aproximativ 99% de puncte (schimba 0.01 pentru a obține un rezultat mai bun):
public static double getMax(double[] vals){
final double[] max = {Double.NEGATIVE_INFINITY};
IntStream.of(new Random().ints((int) Math.ceil(Math.log(0.01) / Math.log(1.0 - (1.0/vals.length))),0,vals.length).toArray())
.forEach(r -> max[0] = (max[0] < vals[r])? vals[r]: max[0]);
return max[0];
}
(Nu foarte serios)
Modul de bază pentru a obține min/max valoare de o Matrice. Dacă aveți nevoie nesortate matrice, puteți crea o copie sau se trece la o metodă care returnează min sau max. Dacă nu, sortat este mai bine, deoarece se efectuează mai rapid în unele cazuri.
public class MinMaxValueOfArray {
public static void main(String[] args) {
int[] A = {2, 4, 3, 5, 5};
Arrays.sort(A);
int min = A[0];
int max = A[A.length -1];
System.out.println("Min Value = " + min);
System.out.println("Max Value = " + max);
}
}