빠에야는 개발중
다중 조건 정렬 본문
여러 조건을 만족하는 정렬을 구현해보자. 우선 정렬할 객체를 생성할 클래스를 작성한다. 여기서는 Student로 하겠다.
1 2 3 4 5 6 7 8 9 10 11 | class Student { int num; String name; String address; Student(int num, String name, String address) { this.num = num; this.name = name; this.address = address; } } | cs |
그 다음 Comparator 인터페이스를 구현하는 StudentCompare 클래스를 작성한다. 이때 Comparator 인터페이스의 제네릭 타입을 정해줘야한다. Student 끼리 비교하기 때문에 Student로 설정한다.
StudentCompare 클래스 안에는 Comparator 인터페이스의 compare 메소드를 오버라이딩 하여 구현한다. 메소드 내에는 우선순위 별로 조건을 걸고, 오름차순(알파벳은 ABC, 한글은 가나다, 숫자는 123)이면 음수값을, 같다면 0, 내림차순은 양수값을 리턴한다. 여기서 우선순위는 학번, 이름, 주소 순이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class StudentCompare implements Comparator<Student> { int ret = 0; @Override public int compare(Student s1, Student s2) { if(s1.num < s2.num) { ret = -1; } if(s1.num == s2.num) { if(s1.name.compareTo(s2.name) == 0) { if(s1.address.compareTo(s2.address) < 0) { ret = 1; } else if(s1.address.compareTo(s2.address) == 0) { ret = 0; } else if(s1.address.compareTo(s2.address) > 0) { ret = -1; } } else if(s1.name.compareTo(s2.name) < 0) { ret = -1; } else if(s1.name.compareTo(s2.name) > 0) { ret = 1; } } if(s1.num > s2.num) { ret = 1; } return ret; } } | cs |
직접 값을 주는 것 말고도 비교 메소드의 리턴값을 넘기는 방법도 있다.
1 2 3 4 | if(s1.num < s2.num) { ret = Integer.compare(s1.num, s2.num); //오름차순 ret = Integer.compare(s2.num, s1.num); //내림차순 } | cs |
이렇게 구현한 StudentCompare 클래스의 객체를 Collections.sort() 메소드의 인자로 넣어준다.
1 2 3 4 5 6 7 8 9 | List<Student> list = new ArrayList<>(); Student s1 = new Student(11001244, "아무개", "서울시 금천구"); Student s2 = new Student(25109435, "김김김", "서울시 중랑구"); Student s3 = new Student(11005338, "사이다", "서울시 은평구"); list.add(s1); list.add(s2); list.add(s3); Collections.sort(list, new StudentCompare()); | cs |
결과값은 다음과 같다.
짧게 축약하여 다음과 같이 정렬할 수도 있다. getter 메소드를 만들어서 그 값을 기준으로 정렬한다. 추가 기준은 thenComparing 메소드를 사용한다. 기준이 복잡하면 Comparator 객체를 하나 만들어서 인자로 던져주면 된다. 깔끔한 코드가 만들어진다.
1 2 3 4 5 6 7 8 | //모두 오름차순 정렬 list.sort(Comparator.comparing(Student::getNum).thenComparing(Student::getName) .thenComparing(Student::getAddress)); //이름만 내림차순 Comparator<Student> reverse = Comparator.comparing(Student::getName).reversed(); list.sort(Comparator.comparing(Student::getNum).thenComparing(reverse) .thenComparing(Student::getAddress)); |
정렬 조건을 정하는 방법 중에서는 Comparable 인터페이스를 구현하는 방법도 있다. 하지만 이는 기존의 정렬 기준을 사용하는 것이고 직접 정렬 기준을 만들때는 Comparator 인터페이스가 더 적합하다.
결국 부족한 라이브러리 지식 때문에 문제를 풀지 못한 것이었다. 많은 문제를 풀면서 도구들을 손에 익혀야겠다.
'공부 > 알고리즘 문제' 카테고리의 다른 글
문자열 내림차순으로 배치하기 (0) | 2018.02.16 |
---|---|
물통 (0) | 2018.02.16 |
별 찍기를 하다가 발견한 멋진 풀이 (0) | 2018.02.10 |
날짜 계산 (0) | 2018.02.08 |
스택 두 개로 큐 만들기 (786) | 2018.01.27 |