ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] - 객체의 특정한 값으로 객체 정렬하기
    Java 2018. 11. 15. 16:34

    개발을 하다보면 정렬을 단순히 정수, 실수 형 배열에서 정렬을 하는 경우 말고 객체 자체를 정렬해야되는 경우도 생긴다.


    객체를 어떻게 정렬하지?? 고민하다가 Comparable 이라는 인터페이스를 찾았다.

    Comparable 를 implements 하면 compareTo 라는 메서드를 override 하게 되는데 이 compareTo 메서드에 정렬 조건을 추가 해주면 된다.


    예제 소스로 보면서 이해를 해보도록 하자.

    시작시간과 종료 시간을 가지고 있는 Time 이라는 객체가 있고 10개의 List에 배열이 insert가 돼 있다고 한다.

    무작위 값이 들어가 있고 이 값들을 종료 시간이 작은순(종료시간의 오름차순) 으로 정렬을 하고 만약 종료시간이 같다면 시작 시간의 오름차순으로 정렬을 한다.

    아래 소스는 위의 내용을 구현한 전체 소스다


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     

    import 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;
        }
        @Override
        public 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를 먼저 봐야 이해를 할 수 있다.



    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    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;
        }
        @Override
        public 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

    댓글

Designed by Tistory.