wake-up-neo.com

Ermitteln des Max/Min-Werts in einem Array von Grundelementen mit Java

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?

151
Nick Heiner

Verwendung von Commons Lang (zum Konvertieren) + Sammlungen (in 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));
   }
}

Beachten Sie, dass Arrays.asList() das zugrunde liegende Array umschließt. Es sollte daher nicht zu speicherintensiv sein und keine Kopie der Elemente des Arrays erfolgen.

151

Sie können einfach das neue Java 8 Streams verwenden, müssen jedoch mit int arbeiten.

Die Methode stream der Dienstprogrammklasse Arrays gibt Ihnen eine IntStream , auf der Sie die min -Methode verwenden können. Sie können auch max , sum , average , ...

Die Methode getAsInt wird verwendet, um den Wert aus der OptionalInt zu erhalten.

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)
    }

}

== UPDATE ==

Wenn die Ausführungszeit wichtig ist und Sie die Daten nur einmal durchgehen möchten, können Sie die Methode summaryStatistics() so verwenden

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);
    }
}

Dieser Ansatz kann zu einer besseren Leistung als die klassische Schleife führen, da die summaryStatistics -Methode eine Reduktionsoperation ist und die Parallelisierung ermöglicht.

55
Ortomala Lokni

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:

Chars.min(myarray)

Es sind keine Konvertierungen erforderlich und vermutlich effizient implementiert.

54
Andrew McKinlay

Ja, es wird in der Collections Klasse gemacht. Beachten Sie, dass Sie Ihr primitives Zeichen-Array manuell in ein Zeichen [] konvertieren müssen.

Eine kurze Demo:

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)));
    }
}
20
Bart Kiers
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);

  }

}
16
Lubna_Nsour

Ich habe eine kleine Hilfsklasse in allen meinen Anwendungen mit Methoden wie:

public static double arrayMax(double[] arr) {
    double max = Double.NEGATIVE_INFINITY;

    for(double cur: arr)
        max = Math.max(max, cur);

    return max;
}
9
Sauer

Sie können dies leicht mit einer IntStream und der max()-Methode tun.

Beispiel

public static int maxValue(final int[] intArray) {
  return IntStream.range(0, intArray.length).map(i -> intArray[i]).max().getAsInt();
}

Erläuterung

  1. range(0, intArray.length) - Um einen Stream mit so vielen Elementen zu erhalten, wie er in der intArray vorhanden ist.

  2. map(i -> intArray[i]) - Ordnen Sie jedes Element des Streams einem tatsächlichen Element der intArray zu.

  3. max() - Liefert das maximale Element dieses Streams als OptionalInt.

  4. getAsInt() - Packen Sie die OptionalInt aus. (Sie könnten hier auch verwenden: orElse(0), nur für den Fall, dass die OptionalInt leer ist.)

3
winklerrr
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);
}
}
2
mark2

Beispiel mit Schwimmer:

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];
}
1
Andrey

Übergeben Sie das Array an eine Methode, die es mit Arrays.sort() sortiert, so dass es nur das Array sortiert, das von der Methode verwendet wird, und setzt min auf array[0] und max auf array[array.length-1].

1
whoduexpect

Hier eine Dienstprogrammklasse, die min/max-Methoden für primitive Typen bereitstellt: Primitives.Java

1
Christoph
    public int getMin(int[] values){
        int ret = values[0];
        for(int i = 1; i < values.length; i++)
            ret = Math.min(ret,values[i]);
        return ret;
    }
0

Eine Lösung mit 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

Im obigen Code gibt reduce() Daten im Optional-Format zurück, die Sie mit getAsInt() in int konvertieren können. 

Wenn Sie den Maximalwert mit einer bestimmten Zahl vergleichen möchten, können Sie in reduce() einen Startwert festlegen:

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

Wenn im obigen Code reduce() eine Identität (Startwert) als erster Parameter angegeben ist, werden Daten im gleichen Format mit der Identität zurückgegeben. 

0
Simon Zhang

Hier ist eine Lösung, um den maximalen Wert in etwa 99% der Läufe zu erhalten (ändern Sie 0,01, um ein besseres Ergebnis zu erhalten):

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];
}

(Nicht ganz ernst gemeint)

0
mnzl

Der grundlegende Weg, um den Min/Max-Wert eines Arrays zu ermitteln. Wenn Sie das unsortierte Array benötigen, können Sie eine Kopie erstellen oder an eine Methode übergeben, die die Min- oder Max-Werte zurückgibt. Wenn nicht, ist das sortierte Array besser, da es in manchen Fällen schneller ist.

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);
    }
}
0
Kim G.