Java를 사용하여 기본 배열에서 최대 / 최소 값 찾기


185

배열에서 최소 / 최대 값을 결정하는 함수를 작성하는 것은 간단합니다.

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

그러나 이것은 이미 어딘가에서 이루어지지 않았습니까?


8
컨테이너의 배열에 대한 기본 배열은 stackoverflow.com/questions/3770289/… 다음에 도움 이됩니다 Collections.max(Arrays.asList()).
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

나는 단지 자바가 얼마나 바보인지를 좋아한다
Farid

답변:


173

Commons Lang 사용 (변환) + 콜렉션 (최소 / 최대)

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()기본 배열 을 래핑하므로 메모리를 너무 많이 사용해서는 안되며 배열 요소에 대해 복사를 수행해서는 안됩니다.


9
무엇입니까ArrayUtils
Basheer AL-MOMANI

4
Arrays.asList()괜찮을 것이지만의 ArrayUtils.toObject()각 요소 a를의 새 배열에 복사합니다 Character.
EM

5
Arrays.asList(a)작동하지 않습니다. 프리미티브 목록을 만들 수 없습니다 ( List<char>이 경우). 먼저 기본 값을 객체로 변환해야하므로 이것이 ArrayUtils.toObject사용됩니다.
nessa.gp

96

당신은 단순히 새로운 자바 8 사용할 수 있습니다 Stream 하지만 당신과 함께 일해야한다 int.

stream유틸리티 클래스의 방법은 Arrays당신에게주는 IntStream당신이 사용할 수에 min방법을. 당신도 할 수있는 max, sum, average, ...

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방법이 축소 연산 이고 병렬화 가 가능 하기 때문에 기존 루프보다 성능이 향상 될 수 있습니다.


57

구글 구아바 라이브러리 는 등 숯을, INTS, 걷고, 클래스의 최소 및 최대 방법이있다.

따라서 다음을 간단히 사용할 수 있습니다.

Chars.min(myarray)

변환이 필요하지 않으며 아마도 효율적으로 구현됩니다.


4
그것은 길이가 0 인 배열에 대해 IllegalArgumentException을 던지는 것을 제외하고는 질문에서 다소 비슷하게 구현됩니다. ( code.google.com/p/guava-libraries/source/browse/trunk/src/com/… )
ColinD

3
이것이 여기에있는 모든 것의 최상의 솔루션입니다. 모든 java.util.Arrays # asList varargs 혼동을 피하십시오.
Kong

20

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

1
Collections.min (myCollection); 배열에 사용하려면 Collections.min (Arrays.asList (myArray));
Zed

3
변환 char []A와 Character []최대 값을 결정하는 유일한 것은 매우 비효율적이다 - 더 나은 유사 각 원시 형 정적 방법과 유틸리티 클래스를 만들 java.util.Arrays: java.sun.com/javase/6/docs/api/java/util/Arrays.html
Christoph

@Christoph : 예, 배열의 크기가 크면 동의합니다. 단순히 "비효율적"이라고 말하는 것은 문제의 애플리케이션이 많은 데이터베이스 호출 및 / 또는 I / O 작업을 수행하고 어레이의 크기가 (상대) 작 으면 의미가 없습니다.
Bart Kiers

java.sun.com/javase/6/docs/api/java/lang/… 성능 Character.valueOf(chars[i])대신에 사용해야 합니다 new Character(chars[i]).
Christoph

@Christoph Christoph는 옳습니다. 최소 최대 검색을 위해 배열을 컬렉션으로 변환하는 것은 비효율적이고 어리 석습니다.
AlexWien

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

  }

}

4
설명을 제공해주세요.
Mike Stockdale

3
이것이 의미하는 바는 정의에 따라 배열을 오름차순으로 정렬하면 최소값은 항상 첫 번째 위치, a [0]에 있고 최대 값은 항상 마지막 위치에 있다는 것입니다 , [a. 길이 -1].
Jeff

1
이것은 문제를 해결하는 합법적이고 유용한 방법입니다. 다른 것과 비교하여 사용하면 어떤 단점이 있습니까?
Alex

8
@alex 시간 복잡성-정렬은 기껏해야 O (nlogn) 업무이며 Michael Rutherfurd 접근 방식은 O (n)입니다.
jajdoo

3
리스트에 대한 단일 반복이 최소 및 최대를 찾기에 충분하므로 정렬이 필요하지 않습니다.
akhil_mittal

11

다음과 같은 방법으로 모든 응용 프로그램에 작은 도우미 클래스가 있습니다.

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

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

    return max;
}

1
double max = Double.NEGATIVE_INFINITY;를 사용해야합니다. double max = Double.MIN_VALUE 대신; double의 MIN_VALUE가 양수
이므로

1
... 또는 배열의 첫 번째 항목으로 max를 설정하고 두 번째 항목에서 반복 할 수 있습니다. 내 답변을 참조하십시오.
Nicholas Hamilton

3

IntStreammax()방법으로 쉽게 할 수 있습니다 .

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

설명

  1. range(0, intArray.length)-에있는 요소 수만큼 스트림을 가져옵니다 intArray.

  2. map(i -> intArray[i])-스트림의 모든 요소를의 실제 요소에 매핑합니다 intArray.

  3. max()-이 스트림의 최대 요소를로 가져옵니다 OptionalInt.

  4. getAsInt()-포장을 풉니 다 OptionalInt. (당신은 또한 여기에 사용할 수 있습니다 orElse(0), 의인 경우 OptionalInt비어 있습니다.)



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

이것은 숫자를위한 int것이지만 질문은 원시적 가치를 요구하고 있습니다int, long, char, byte....
IgniteCoders

2

솔루션 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

위의 코드에서 reduce()데이터를 반환 Optional당신이 변환 할 수있는 형식 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

위의 코드 reduce()에서 첫 번째 매개 변수로 ID (시작 값)를 사용하면 ID와 동일한 형식으로 데이터를 반환합니다. 이 속성을 사용하면이 솔루션을 다른 배열에 적용 할 수 있습니다.

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

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

솔루션은 작동하지만 O (nlogn)에 대한 시간 복잡성을 증가시키는 반면 다른 답변을 사용하여 O (n)에서 min을 쉽게 찾을 수 있습니다.
Pramod

이 상황에서 일종의 것을 사용하는 것은 단순히 미친 것입니다.
Nicholas Hamilton

처음 n> 1 가장 작거나 큰 값이 필요할 때 약간의 수리가 필요할 때 유용 할 수 있습니다.
biziclop

1

다음은 실행의 약 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];
}

(완전히 심각하지는 않음)


;-) "완전히 심각하지는 않습니다". 공감하는 것을 망설이고…
Ole VV

0

함께 정렬을하는 방법으로 배열을 전달 Arrays.sort()에만 상기 방법은 사용되는 배열이 정렬되도록 한 다음 설정 으로 array[0]하고 최대array[array.length-1].


3
그것은 지적 아마 가치가있는) 큰 배열이 수정 배열, 및 B)가 더 비싼 솔루션 O 오히려 O (n보다 (nlog n)이)입니다
davidsheldon

0

배열의 최소 / 최대 값을 얻는 기본 방법입니다. 정렬되지 않은 배열이 필요한 경우 복사본을 만들거나 최소 또는 최대 값을 반환하는 메서드에 전달할 수 있습니다. 그렇지 않은 경우 정렬 된 배열은 경우에 따라 더 빨리 수행되므로 더 좋습니다.

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

2
정렬 문제는 O (n) 문제에 대해 O (n log n) 오버 헤드가 있다는 것입니다. 그러나 이것은 이미 주어진 다른 세 가지 "배열 정렬"답변보다 낫습니다.
Teepeemm 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.