본문 바로가기
JAVA

JAVA - Class 객체의 ArrayList 다중 정렬

by khds 2021. 9. 13.

 

ArrayList 를 class로 정의한 후 정렬 해야할 때 Comparator를 만들어서 정렬을 할 수 있다. 사용방식은 아래와 같다.

 

    private static class Meeting {

        private Long startTime;
        private Long endTime;

        public Meeting(Long startTime, Long endTime) {
            this.startTime = startTime;
            this.endTime = endTime;
        }

        public Long getStartTime() {
            return startTime;
        }

        public Long getEndTime() {
            return endTime;
        }
    }

 

static class MeetingComparator implements Comparator<Meeting> {
        @Override
        public int compare(Meeting a, Meeting b) {
            if (a.getEndTime() > b.getEndTime()) {
                return 1;
            }
            if (a.getEndTime() < b.getEndTime()) {
                return -1;
            }
            return 0;
        }
    }

 

+++++ 아래와 같이 간략화 가능

static class MettingComparator implements Comparator<Metting> {
        @Override
        public int compare(Megtting a, Megtting b) {
            return Integer.compare(a.getEndTime(), b.getEndTime());
        }
    }

 

ArrayList<Meeting> meetings = new ArrayList<>(n);

for (int i = 0; i < n; i++) {
    Long startTime = sc.nextLong();
    Long endTime = sc.nextLong();
    meetings.add(new Meeting(startTime, endTime));
}
Collections.sort(meetings, new MeetingComparator());

 

 

이때 class안에 변수 a에 대해 1차적으로 정렬 후에 a가 같은 값끼리는 변수 b로 2차적으로 정렬을 해야할 때가 있다.

그럴 때는 아래와 같이 작성하면 된다.

 

static class MeetingComparator implements Comparator<Meeting> {
        @Override
        public int compare(Meeting a, Meeting b) {
            if (a.getEndTime() > b.getEndTime()) {
                return 1;
            }
            if (a.getEndTime() == b.getEndTime()) {
                if (a.getStartTime() > b.getStartTime()) {
                    return 1;
                }
                if (a.getStartTime() < b.getStartTime()) {
                    return -1;
                }
            }
            if (a.getEndTime() < b.getEndTime()) {
                return -1;
            }
            return 0;
        }
    }

 

단순히  if 문으로 endTime 변수의 값이 같은 경우를 추가했다.

 

 

static class ArraysComparator<String> implements Comparator<String> {

        @Override
        public int compare(String a, String b) {
            if (a.toString().length() > b.toString().length()) {
                return 1;
            }
            if (a.toString().length() < b.toString().length()) {
                return -1;
            }
            if(a.toString().length() == b.toString().length()){
                if(a.toString().charAt(0) > b.toString().charAt(0)){
                    return 1;
                }
                if(a.toString().charAt(0) < b.toString().charAt(0)){
                    return -1;
                }
                if(a.toString().charAt(0) == b.toString().charAt(0)){
                    return a.toString().compareTo(b.toString());
                }
            }
            return 0;
        }

 

 

참고

https://suite.tistory.com/entry/%EC%A0%95%EB%A0%AC-%EC%9E%90%EB%B0%94-%EB%8B%A4%EC%A4%91-%EC%A0%95%EB%A0%AC-multi-sort

 

[정렬] 자바(java) 다중 정렬 (multi sort)

http://suite.tistory.com fs 2011.2                                      자바에서 리스트 객체의 멤버 값에 따라 정렬시 Collections.sort() 를 사용해보는데 한개 변수..

suite.tistory.com

 

https://www.daleseo.com/java-comparable-comparator/

 

[Java] 객체 정렬하기 1부 - Comparable vs Comparator

Engineering Blog by Dale Seo

www.daleseo.com