Нахождение максимального/минимального значения в массиве примитивов с помощью Java

Тривиально написать функцию для определения минимального/максимального значения в массиве, например:

/**
 * 
 * @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;
}

но разве это уже не сделано где-то?

Комментарии к вопросу (1)
Решение

Использование Commons Lang (для преобразования) + Collections (для минимизации/максимизации)

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

Обратите внимание, что Arrays.asList() оборачивает базовый массив, поэтому он не должен занимать много памяти и не должен выполнять копирование элементов массива.

Комментарии (3)

Вы можете просто использовать новый Java 8 `поток но вы должны работать с инт.

В поток метод в служебный класс массивы дает вам IntStream, на котором вы можете использовать мин метод. Вы также можете делать Макс, сумма, средний,...

В getAsInt метод используется, чтобы получить значение из 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)
    }

}

==Обновления==

Если время выполнения очень важно, и вы хотите, чтобы пройти через данные только один раз можно использовать summaryStatistics() метод такой

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

Такой подход может дать более высокую производительность, чем классические петли, потому что summaryStatistics метод операция по уменьшению и это позволяет распараллеливания.

Комментарии (0)

В библиотеке Google гуава имеет min и Max методы в своих символов, целых чисел, длинных и т. д. классов.

Так что вы можете просто использовать:

Chars.min(myarray)

Никаких преобразований не требуется, и, вероятно, это's эффективно реализованы.

Комментарии (2)

Да, это делается в классе Collections. Обратите внимание, что вам нужно будет вручную преобразовать массив примитивных символов char в Character[].

Небольшая демонстрация:

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)));
    }
}
Комментарии (5)
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);

  }

}
Комментарии (6)

У меня есть маленький помощник класса во всех моих приложений с такими методами, как:

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

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

    return max;
}
Комментарии (2)

Вы могли бы легко сделать это с метод IntStream и Макс ().

Пример ###

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

Объяснение

  1. в диапазоне(0, класса intarray.длина)- получить поток с, как многие элементы, присутствующие вкласса intarray`.

  2. Карта(я -> класса intarray[я])- карте каждого элемента потока к фактическому элементукласса intarray`.

  3. макс()- получить максимальный элемент этого потока, какOptionalInt`.

  4. getAsInt() - развернуть OptionalInt. (Вы можете также использовать здесь: Если(0) на всякий случай `OptionalInt пуст.)

Комментарии (0)

Решение с уменьшить():

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

В приведенном выше коде, уменьшить возвращает данные () в необязательный формат, который можно преобразовать вintвgetAsInt()`.

Если мы хотим сравнить максимальное значение с определенным количеством, мы можем установить начальное значение в метод 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

В приведенном выше коде, когда уменьшить()` с удостоверением (начальное значение) в качестве первого параметра, то она возвращает данные в том же формате, с удостоверением. С этим свойством, мы можем применить это решение на другие массивы:

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
Комментарии (1)
    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;
    }
Комментарии (1)
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 max) {
               max = a[j];
            }

        }
    }

    System.out.println("Max element: " + max);
}
}
Комментарии (0)

Пример с поплавком:

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];
}
Комментарии (3)

Вот решение, чтобы получить максимальное значение в примерно 99% работает (изменить 0,01, чтобы получить лучший результат):

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

(Не вполне серьезно)

Комментарии (1)

Вот утилитарный класс, предоставляющий методы min/max для примитивных типов: Primitives.java

Комментарии (0)

Передать массив в метод, который сортирует ее с массивами.сортировать()так это только сортирует массив методом является использование затем устанавливает *мин* кмассив[0]и *максимум* кмассив[массив.длина-1]`.

Комментарии (1)

Базовые способ получить мин/макс значение массива. Если вам нужен массив несортированный, вы можете создать копию или передать его в метод, который возвращает минимальное или максимальное. Если не отсортированный массив лучше, так как он выполняет быстрее в некоторых случаях.

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);
    }
}
Комментарии (1)