-
[Java] - 객체의 특정한 값으로 객체 정렬하기Java 2018. 11. 15. 16:34
개발을 하다보면 정렬을 단순히 정수, 실수 형 배열에서 정렬을 하는 경우 말고 객체 자체를 정렬해야되는 경우도 생긴다.
객체를 어떻게 정렬하지?? 고민하다가 Comparable 이라는 인터페이스를 찾았다.
Comparable 를 implements 하면 compareTo 라는 메서드를 override 하게 되는데 이 compareTo 메서드에 정렬 조건을 추가 해주면 된다.
예제 소스로 보면서 이해를 해보도록 하자.
시작시간과 종료 시간을 가지고 있는 Time 이라는 객체가 있고 10개의 List에 배열이 insert가 돼 있다고 한다.
무작위 값이 들어가 있고 이 값들을 종료 시간이 작은순(종료시간의 오름차순) 으로 정렬을 하고 만약 종료시간이 같다면 시작 시간의 오름차순으로 정렬을 한다.
아래 소스는 위의 내용을 구현한 전체 소스다
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667import java.util.ArrayList;import java.util.Collections;public class Main {public static void main(String[] args){ArrayList<Time> times = new ArrayList<Time>();int Min = 6;int Max = 21;for(int i=0; i < 10; i++) {int end = Min + (int)(Math.random() * ((Max - Min) + 1));int start = Min + (int)(Math.random() * ((end - Min) + 1));times.add(new Time(start, end));}for(Time t:times) {System.out.println(t.toString());}Collections.sort(times);System.out.println("정렬후");for(Time t:times) {System.out.println(t.toString());}}}class Time implements Comparable<Time>{private int start;private int end;public Time(int start, int end) {this.start = start;this.end = end;}public int getStart() {return this.start;}public int getEnd() {return this.end;}@Overridepublic int compareTo(Time t) {if(this.end < t.getEnd()) {return -1;}else if(this.end == t.getEnd()) {if(this.start < t.getStart()) {return -1;}else if(this.start == t.getStart()) {return 0;}else {return 1;}}else {return 1;}}public String toString() {return "start : " + this.start + " end : " + this.end;}}cs 먼저 이소스에 대한 부분은 Time class를 먼저 봐야 이해를 할 수 있다.
1234567891011121314151617181920212223242526272829303132333435363738class Time implements Comparable<Time>{private int start;private int end;public Time(int start, int end) {this.start = start;this.end = end;}public int getStart() {return this.start;}public int getEnd() {return this.end;}@Overridepublic int compareTo(Time t) {if(this.end < t.getEnd()) {return -1;}else if(this.end == t.getEnd()) {if(this.start < t.getStart()) {return -1;}else if(this.start == t.getStart()) {return 0;}else {return 1;}}else {return 1;}}public String toString() {return "start : " + this.start + " end : " + this.end;}}cs Time 클래스의 생성자가 있고 getter 가 존제한다.
그리고 Comparable 인터페이스를 implements 하고 compareTo 메서드를 override 하였다.
위에 설명 했듯이 compareTo 에 조건을 입력해주면 된다.
두개의 인자를 비교할때 본인이 작으면 -1 같으면 0 상대가 작으면 1 을 리턴한다는건 기본적으로 알고 있어야 한다.
위에 설명했던 조건대로 비교 조건을 입력해준다음 list에 time 객체들이 전부 add 된 뒤에
Collections.sort(times); 로 정렬을 시도하면 원하는 대로 정렬이 이루어 진다.
해당 소스로 정렬을 한 출력값을 올리면서 글을 마친다.
start : 7 end : 17
start : 13 end : 16
start : 7 end : 12
start : 6 end : 13
start : 18 end : 21
start : 9 end : 16
start : 9 end : 13
start : 9 end : 14
start : 19 end : 19
start : 6 end : 7
정렬후
start : 6 end : 7
start : 7 end : 12
start : 6 end : 13
start : 9 end : 13
start : 9 end : 14
start : 9 end : 16
start : 13 end : 16
start : 7 end : 17
start : 19 end : 19
start : 18 end : 21
'Java' 카테고리의 다른 글
[Java] - 랜덤 수 뽑아내기 (0) 2018.11.15 댓글