Java Arrays.sort(), Collections.sort()

min·2022년 5월 21일
0

갑자기 List<Object> 컬렉션에 대해서 정렬하는 방법이 갑자기 생각 안나서 찾아본 김에 정리해본다.

배열 정렬 할 때는 Arrays.sort(), 컬렉션을 정렬 할 때는 Collections.sort() 사용한다.

각각 시간 복잡도는

Arrays.sort() - 평균: O(nlong(n)) / 최악: O(n^2)
Collections.sort() - 평균, 최악: O(nlong(n))

평균적으로 Collections.sort()가 더 빠르다.

테스트 해본 코드

public class SortTest {

    static int[] intArrays = {5, 10, 24, 77, 0};
    static List<Integer> integerList = new ArrayList<>();
    List<Member> members = new ArrayList<>();

    @BeforeAll
    static void beforeAll() {
        StringBuffer sb = new StringBuffer();
        sb.append("sort before = ");
        for (int i : intArrays) {
            integerList.add(i);
            sb.append(i + " ");
        }
        System.out.println(sb.toString());
    }

    @Test
    @DisplayName("Array.sort() 정렬")
    void arraySort() {
        Arrays.sort(intArrays);
        Assertions.assertArrayEquals(new int[]{0, 5, 10, 24, 77}, intArrays);
    }

    @Test
    @DisplayName("Collection.sort() 정렬")
    void collectionSort() {
        Collections.sort(integerList);
        List<Integer> testList = new ArrayList<>();
        testList.add(0);
        testList.add(5);
        testList.add(10);
        testList.add(24);
        testList.add(77);
        Assertions.assertIterableEquals(testList, integerList);
    }

    public class Member implements Comparable<Member> {
        String name;
        int number;

        public Member(String name, int number) {
            this.name = name;
            this.number = number;
        }

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

        // 내림차순 정렬
        @Override
        public int compareTo(Member o) {
            if (this.number > o.number) {
                return -1;
            } else if (this.number < o.number) {
                return 1;
            } else {
                return 0;
            }
        }
    }

    @Test
    @DisplayName("객체 정렬")
    void objectSort() {
        members.add(new Member("min", 20));
        members.add(new Member("test", 27));

        Collections.sort(members);

        System.out.println(members);
    }
}

추가적으로 Assertions.assertIterableEquals 요런게 있다는 걸 알게 됬다. 근데 그냥 기본 타입일 때만 값 비교 해주고 또 Object이면 안해줘서 밑에는 일단 syso로 눈으로 확인했다.

객체의 정렬 기준을 따로 정의하고 싶어 질 때는 implements Comparable<Member> 해서 정렬 기준을 세워 줄 수 있다.

profile
발등에 불이 따뜻하다..

0개의 댓글