Language/Java

[Java] Arrays 클래스

by Donghwan 2021. 11. 2.

Arrays 클래스에는 배열을 다루기 위한 다양한 메소드가 포함되어 있습니다. Arrays 클래스의 모든 메소드는 클래스 메소드(static method)이므로, 객체를 생성하지 않고도 바로 사용할 수 있습니다. 이 클래스는 java.util 패키지에 포함되므로, 반드시 import 문으로 java.util 패키지를 불러오고 나서 사용해야 합니다. 대표적인 메서드는 asList, copyOf, copyOfRange, equals, fill, sort가 있습니다. Arrays은 원시 타입과 제네릭 타입에 대한 메서드들을 제공합니다. 예제는 간편하게 정수형 배열을 기준으로 작성하겠습니다.

 

copyOf

public static int[] copyOf(int[] original, int newLength) {
    int[] copy = new int[newLength];
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}

copyOf는 기준이 되는 배열 original과 복사할 길이 newLength를 주입 받습니다. 만약 복사할 길이가 기존 배열을 초과하면 각 자료형의 기본 값으로 빈 공간을 채워서 반환합니다. 정수형 배열의 경우 0으로 빈 공간을 채운 다음 배열로 반환합니다.

int[] arr = new int[] { 1, 9, 2, 5, 3, 4, 7, 8, 6};

public void copyOfSmallerThanArrLength(int[] arr) {
    int[] array = Arrays.copyOf(arr, arr.length - 3);
    Arrays.stream(array).boxed().collect(Collectors.toList()).forEach(x -> System.out.print(x + " "));
    //result
    //1 9 2 5 3 4
}

public void copyOfEqualArrLength(int[] arr) {
    int[] array = Arrays.copyOf(arr, arr.length);
    Arrays.stream(array).boxed().collect(Collectors.toList()).forEach(x -> System.out.print(x + " "));
    //result
    //1 9 2 5 3 4 7 8 6
}

public void copyOfBiggerThanArrLength(int[] arr) {
    int[] array = Arrays.copyOf(arr, arr.length + 3);
    Arrays.stream(array).boxed().collect(Collectors.toList()).forEach(x -> System.out.print(x + " "));
    //result
    //1 9 2 5 3 4 7 8 6 0 0 0
}

 

copyOfRange

public static int[] copyOfRange(int[] original, int from, int to) {
    int newLength = to - from;
    if (newLength < 0)
        throw new IllegalArgumentException(from + " > " + to);
    int[] copy = new int[newLength];
    System.arraycopy(original, from, copy, 0,
                     Math.min(original.length - from, newLength));
    return copy;
}

copyOfRange는 기준이 되는 배열 original과 시작점 from, 끝점 to을 주입 받습니다. 끝점 to가 기준 배열의 길이보다 길면 그 빈 공간을 각 자료형의 기본 값으로 빈 공간을 채워서 반환합니다. 마찬가지로 정수형이기 때문에 0으로 채워서 반환하게 됩니다. 하지만 끝점에서 시작점을 뺀 값이 0보다 작은 경우에는 IllegalArgumentException을 발생 시킵니다. 이유는 코드에 나오듯 시작점이 끝점보다  클 경우는 허용하지 않습니다.

int[] arr = new int[] { 1, 9, 2, 5, 3, 4, 7, 8, 6};

public void copyOfRangeFromBiggerThanTo(int[] arr) {
    int[] array = Arrays.copyOfRange(arr, arr.length, 0);
    Arrays.stream(array).boxed().collect(Collectors.toList()).forEach(x -> System.out.print(x + " "));
    //result
    //java.lang.IllegalArgumentException: 9 > 0
}

public void copyOfRangeZeroToHalf(int[] arr) {
    int[] array = Arrays.copyOfRange(arr, 0, (arr.length / 2));
    Arrays.stream(array).boxed().collect(Collectors.toList()).forEach(x -> System.out.print(x + " "));
    //result
    //1 9 2 5
}

public void copyOfRangeHalfToOver(int[] arr) {
    int[] array = Arrays.copyOfRange(arr, (arr.length / 2), arr.length + 3);
    Arrays.stream(array).boxed().collect(Collectors.toList()).forEach(x -> System.out.print(x + " "));
    //result
    //3 4 7 8 6 0 0 0
}

 

fill

public static void fill(int[] a, int val) {
    for (int i = 0, len = a.length; i < len; i++)
        a[i] = val;
}

fill은 전달받은 배열의 모든 요소를 특정 값으로 초기화해 줍니다. 초기화할 배열 a와 초기화할 값 val을 주입 받습니다.

public static void fill() {
    int[] array = new int[10];
    Arrays.fill(array, 7);
    Arrays.stream(array).boxed().collect(Collectors.toList()).forEach(x -> System.out.print(x + " "));
}
//result
//7 7 7 7 7 7 7 7 7 7

 

sort

public void sort(int[] a) {
    DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}

public void sort(int[] a, int fromIndex, int toIndex) {
    rangeCheck(a.length, fromIndex, toIndex);
    DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
}

sort는 전달받은 배열의 모든 요소를 오름차순으로 정렬합니다. 정렬할 배열 a만 주입 받거나 fromIndex와 toIndex를 주입 받아 특정 범위에 대한 정렬도 가능합니다. 따라서 이 메소드는 전달받은 원본 배열의 순서를 변경하게 됩니다. 코드를 보면 QuickSort를 사용하여 정렬하기 때문에 빠르게 정렬이 가능합니다. 내림차순으로 정렬하고 싶다면 원시형을 참조형으로 변경한 다음 Collections.reverseOrder를 이용하여 내림차순 정렬을 할 수 있습니다. 이 방법은 Comparator를 이용하여 정렬하는 방법으로 Comparator의 구현을 통해 조건을 직접 설정할 수 있습니다. 

int[] arr = new int[] { 1, 9, 2, 5, 3, 4, 7, 8, 6};

public void sortByAsc() {
    int[] array = Arrays.copyOf(arr, arr.length);
    Arrays.sort(array);
    Arrays.stream(array).boxed().collect(Collectors.toList()).forEach(x -> System.out.print(x + " "));
    //result
    //1 2 3 4 5 6 7 8 9
}

public void sortByDesc() {
    Integer[] array = Arrays.stream(Arrays.copyOf(arr, arr.length)).boxed().toArray(Integer[]::new);
    Arrays.sort(array, Collections.reverseOrder());
    Arrays.stream(array).collect(Collectors.toList()).forEach(x -> System.out.print(x + " "));
    //result
    //9 8 7 6 5 4 3 2 1
}

 

binarySearch

public static int binarySearch(int[] a, int key) {
    return binarySearch0(a, 0, a.length, key);
}

public static int binarySearch(int[] a, int fromIndex, int toIndex,
                               int key) {
    rangeCheck(a.length, fromIndex, toIndex);
    return binarySearch0(a, fromIndex, toIndex, key);
}

private static int binarySearch0(int[] a, int fromIndex, int toIndex,
                                 int key) {
    int low = fromIndex;
    int high = toIndex - 1;

    while (low <= high) {
        int mid = (low + high) >>> 1;
        int midVal = a[mid];

        if (midVal < key)
            low = mid + 1;
        else if (midVal > key)
            high = mid - 1;
        else
            return mid; // key found
    }
    return -(low + 1);  // key not found.
}

binarySearch는 이진 탐색을 실행해서 원하는 값이 몇번째에 있는지 찾아주는 역할을 합니다. 타겟이 될 배열 a와 찾을 값 key를 받고 상황에 따라 fromIndex와 toIndex를 넣어서 진행할 수 있습니다. binarySearch는 정렬이 되어 있어여 한다는 선행 조건이 있기 때문에 반드시 Arrays로 오름차순 정렬을 해준 다음 실행하도록 합니다.

int[] arr = new int[] { 1, 9, 2, 5, 3, 4, 7, 8, 6};

public static void binarySearch(int[] arr) {
    int[] array = Arrays.copyOf(arr, arr.length);
    Arrays.sort(array);
    System.out.print(Arrays.binarySearch(array, 3));
}

//result
//2

 


참고자료

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] 반복문  (0) 2021.11.06
[Java] 조건문  (0) 2021.11.05
[Java] String과 String Pool  (0) 2021.11.01
[Java] String의 불변성( Immutable )  (0) 2021.11.01
[Java] 동일성과 동등성 ( == vs equals )  (0) 2021.11.01

댓글