본문 바로가기
개발/자바

compareTo()가 0을 반환하면 어떤 순서로 정렬되나?

by hamcheeseburger 2022. 2. 19.

우테코 2주차에서 학습로그로 compareTo() 파헤치기를 작성했다.

페어와 학습로그 말하기에서 해당 내용을 이야기하고 페어와의 질문 시간을 가졌다.

페어가 'compareTo()로 정렬을 할 때 비교한 값이 같으면 어떤 순서로 지정이 되는지' 질문을 하였지만 대답하지 못했다. 🥲 

 

페어가 말하길, 비교한 값이 같으면 리스트에 삽입된 순서로 지정되지 않을까라고 했지만, 확실히 하는 것이 좋을 것 같아 이렇게 글을 작성해본다.

 

아래와 같은 객체가 있다고 치자.

public class RacingCar implements Comparable<RacingCar> {

    private final String name;
    private final int position;

    public RacingCar(final String name, final int position) {
        this.name = name;
        this.position = position;
    }

    public String getName() {
        return name;
    }

    @Override
    public int compareTo(final RacingCar anotherCar) {
        return this.position - anotherCar.position;
    }
}

 

 

예상한 대로 동작하는지 확인하기 위해 아래와 같이 테스트 코드를 작성하였다.

public class RacingCarTest {

    private List<RacingCar> racingCars;

    @BeforeEach
    void setup() {
        racingCars = new ArrayList<>();
        racingCars.add(new RacingCar("포비", 3));
        racingCars.add(new RacingCar("코난", 1));
        racingCars.add(new RacingCar("우테코", 2));
        racingCars.add(new RacingCar("코린", 1));
    }

    @Test
    @DisplayName("비교한 숫자가 같은 값일 때 정렬 순서는 입력한 순서와 같다.")
    void compareInteger() {
        Collections.sort(racingCars);
        assertThat(racingCars.stream()
            .map(car -> car.getName()).collect(Collectors.toList()))
            .containsExactly("코난", "코린", "우테코", "포비");

    }
}

배열을 초기화 할 때 '코난' 뒤에 '코린'이 insert 되었기 때문에, 정렬 후에도 같은 순서로 지정되기를 예상하고 있다.

 

 

테스트가 성공했다 !

 

 

설마 이번 한 번만 그런거 아닌가? 해서 @RepeatedTest() 로 다시 돌려봤다.

@RepeatedTest(10)
@DisplayName("비교한 숫자가 같은 값일 때 정렬 순서는 입력한 순서와 같다.")
void compareInteger() {
    Collections.sort(racingCars);
    assertThat(racingCars.stream()
        .map(car -> car.getName()).collect(Collectors.toList()))
        .containsExactly("코난", "코린", "우테코", "포비");
}

 

이것도 마찬가지로 성공!

 

 

결론

compareTo()로 정렬을 할 때 비교한 값이 같으면, 기존 배열에서 insert 된 순서로 지정이 된다.

'개발 > 자바' 카테고리의 다른 글

함수형 인터페이스 (Functional Interface)  (6) 2022.03.30
추상화란?  (2) 2022.03.17
Java Stream.max() 사용법  (0) 2022.02.14
Comparable의 compareTo() 파헤치기  (0) 2022.02.14
JUnit 사용법  (0) 2022.02.11

이전 댓글