[IT] JAVA

[JAVA] 객체 List 정렬 및 2번째 조건으로 정렬

오리엔탈킴 2022. 7. 13. 13:01

안녕하세요, 자바 Collection 자료 구조 중 순서가 있는 List 계열의 ArrayList, LinkedList, Stack, Vector 자료 구조 정렬에 대해서 정리를 하려고 합니다. 여러 가지 방법 중에서 객체 리스트를 Collections.sort 메서드, Comparator - compare 메서드를 이용하여 정렬하는 법과 객체 리스트에서 1번째 정렬 조건이 같을 때 2번째 정렬 조건으로 정렬을 하는 법을 간단히 정리하려고 합니다.

객체 리스트 정렬

객체 리스트를 아래와 같이 Collections.sort 메서드를 이용하여 정렬하는 예제를 간단하게 작성해보겠습니다. id와 age 인자를 가진 User라는 객체를 생성한 다음 아래와 같이 리스트에 add를 해줍니다.

class User {
    int id;
    int age;
    public User(int id, int age){
        this.id = id;
        this.age = age;
    }
}

public class compareTest {
    public static void main(String[] args) throws Exception {

        ArrayList<User> userList = new ArrayList<>();

        userList.add(new User( 1, 10));
        userList.add(new User( 2, 5));
        userList.add(new User( 3, 10));

    }
}

 

만약 age를 기준으로 오름차순으로 정렬을 해야할 경우, Collections.sort와 Comparator 인터페이스 내에 compare 메서드를 오버라이드해줘서 아래와 같이 정렬을 구현합니다. 그리고 userList를 출력해보면, User2 (5살) > User1 (10살) > User3 (10살) 순으로 정렬이 됩니다.

compare 메소드의 리턴 값이 양수가 될 경우 자리를 바꾸게 되고, 음수일 경우 그대로 유지를 하게 되어 오름차순이 구현이 되게 됩니다. 만약 내림차순이라면 "return o2.age - o1.age" 와 같이 o1과 o2의 자리를 바꾸면 됩니다.

        // age로 오름차순 정렬
        Collections.sort( userList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.age - o2.age;
            }
        });

        for(User u : userList) System.out.println("User"+ u.id + " (" + u.age + "살)");
        // User2 (5살) > User1 (10살) > User3 (10살)

 

위의 Comparator는 람다식으로 아래와 같이 간단히 구현이 가능합니다.

        // 람다 이용
        Collections.sort( userList, (o1,o2) -> o1.age - o2.age );

 

객체 리스트 2번째 조건으로 정렬

위의 예제에서 User1 (10살), User3 (10살)은 나이가 같은데, 현재는 입력받은데로 User1 > User3 순으로 정렬이 되어 있는데요, age가 같을 경우 id의 내림차순으로 정렬을 하기 위해서는 아래와 같이 age가 같을 경우의 리턴 값을 새로 정의를 합니다.

        // 두번째 조건으로 age가 같을 시, id 내림차순으로 정렬
        Collections.sort( userList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                if(o1.age - o2.age == 0){
                    return o2.id - o1.id;
                }
                return o1.age - o2.age;
            }
        });

        for(User u : userList) System.out.println("User"+ u.id + " (" + u.age + "살)");
        // User2 (5살) > User3 (10살) > User1 (10살)

 

위와 같이 작성을 하면, User3 > User1과 같이 age가 같은 경우 id의 내림차순으로 변경이 되는 것을 확인할 수 있습니다.

 

전체 테스트 코드는 아래와 같습니다.

class User {
    int id;
    int age;
    public User(int id, int age){
        this.id = id;
        this.age = age;
    }
}

public class compareTest {
    public static void main(String[] args) throws Exception {

        ArrayList<User> userList = new ArrayList<>();

        userList.add(new User( 1, 10));
        userList.add(new User( 2, 5));
        userList.add(new User( 3, 10));

        // age로 오름차순 정렬
        Collections.sort( userList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.age - o2.age;
            }
        });
        // 람다 이용
        Collections.sort( userList, (o1,o2) -> o1.age - o2.age );

        for(User u : userList) System.out.println("User"+ u.id + " (" + u.age + "살)");
        // User2 (5살) > User1 (10살) > User3 (10살)

        // 두번째 조건으로 age가 같을 시, id 내림차순으로 정렬
        Collections.sort( userList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                if(o1.age - o2.age == 0){
                    return o2.id - o1.id;
                }
                return o1.age - o2.age;
            }
        });

        for(User u : userList) System.out.println("User"+ u.id + " (" + u.age + "살)");
        // User2 (5살) > User3 (10살) > User1 (10살)

    }
}

 

반응형