본문 바로가기

java

[210411] java Arrays.sort()

Arrays.sort()


public static void sort(Object[] a)

public static void sort(Object[] a, int fromIndex, int toIndex)

public static <T> void sort(T[] a, Comparator<? super T> c)

public static <T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)

특정 객체 배열을 오름차순으로 정렬해주는 메소드이다. sort 메소드를 사용하기 위해서는, 배열에 들어있는 요소가 Comparable 인터페이스를 상속받아야만 한다. 또한, compareTo 메소드를 통해 요소간 비교가 가능해야 한다. mergesort를 사용할 때와 같은 시간복잡도를 보장한다. 

 

Parameters: 

a : 정렬 할 배열

fromIndex : 정렬을 시작할 인덱스 번호

toIndex : 정렬을 마칠 인덱스 번호 (n을 입력 시, fromIndex부터 n-1번째 까지의 요소를 정렬한다. 

c : 배열의 정렬 규칙을 결정하는 Comparator 객체. 이 값이 null일 경우 자연 정렬 순서를 따른다. 

 

Throws: 

ClassCastException : 배열의 요소끼리 비교가 불가능할 때 발생한다. 

illegalArgumentException : 배열 요소의 자연 정렬 순서가 Comparable 규칙을 위반할 때 발생한다. 

 

 

실행 예제 


1) 기본 자료형 배열 정렬 

import java.util.*;

public class Main {

    public static void main(String[] args) {

        // 1. int 배열 정렬
        int[] intArray = {2,1,9,7,3,5,4,6,8};

        System.out.println("int 배열 정렬");
        Arrays.sort(intArray);
        for(int i = 0 ; i < intArray.length ; i++){
            System.out.print(intArray[i] + " ");
        }
        System.out.println(" ");

        // 2. char 배열 정렬
        char[] charArray = {'a', 'k', 'i', 'z', 'p', 'b', 'r'};

        System.out.println("char 배열 정렬");
        Arrays.sort(charArray);
        for(int i = 0 ; i < charArray.length ; i++){
            System.out.print(charArray[i] + " ");
        }
        System.out.println(" ");

        // 3. string 배열 정렬
        String[] stringArray = {"Tom", "James", "Jane", "Anna", "Chris"};

        System.out.println("int 배열 정렬");
        Arrays.sort(stringArray);
        for(int i = 0 ; i < stringArray.length ; i++){
            System.out.print(stringArray[i] + " ");
        }
        System.out.println(" ");
        
    }

}

- 실행 결과 

기본적으로 정해진 오름차순(정수는 0-9 순서, 문자는 a-z 순서)으로 정렬이 된 것을 확인할 수 있었다. 

 

 

2) Comparator를 사용한 정렬 

import java.util.*;

public class Main {

    public static class Person implements Comparable<Person>{
        int age;
        String name;

        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }

        @Override
        public int compareTo(Person o) {
            if(this.name.equals(o.name)){
                return this.name.compareTo(o.name);
            }else{
                return this.age < o.age ? 1 : -1;
            }
        }

        @Override
        public String toString() {
            return "Person{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) {

        // 1. int 배열 내림차순 정렬
        System.out.println("1. int 배열 내림차순 정렬");
        Integer[] arr = {1,5,2,4,3};

        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 < o2 ? 1 : -1;
            }
        });
        // Arrays.sort(arr, (o1, o2) -> o2 - o1);

        for(int i = 0 ; i < arr.length ; i++){
            System.out.println(arr[i] + " ");
        }

        // 2. Person 클래스 정렬
        System.out.println("2. Person 클래스 정렬");
        Person[] personArray = new Person[5];

        personArray[0] = new Person(25, "David");
        personArray[1] = new Person(48, "Chris");
        personArray[2] = new Person(22, "James");
        personArray[3] = new Person(25, "Anne");
        personArray[4] = new Person(35, "Kevin");

        Arrays.sort(personArray);

        for(int i = 0 ; i < personArray.length ; i++){
            System.out.println(personArray[i].toString());
        }

    }

}

 

-실행 결과 

int 배열의 경우 Arrays.sort()의 두번째 매개변수로 Comparator 객체를 넘겼다. 

person 클래스 또한, Comparable을 implement한 뒤 Compare 메소드를 상속받아서 정렬 기준을 작성하였다. 나이가 많은 순서대로 정렬하며, 나이가 같을 시 이름 순서대로 정렬함을 확인할 수 있다. 

 

 

 

- 참고 자료

docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(char[],%20int,%20int) 

 

Arrays (Java Platform SE 7 )

Sorts the specified array into ascending numerical order. Implementation note: The sorting algorithm is a Dual-Pivot Quicksort by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm offers O(n log(n)) performance on many data sets that cau

docs.oracle.com