우테코 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 |
이전 댓글