갑자기 List<Object>
컬렉션에 대해서 정렬하는 방법이 갑자기 생각 안나서 찾아본 김에 정리해본다.
배열 정렬 할 때는 Arrays.sort()
, 컬렉션을 정렬 할 때는 Collections.sort()
사용한다.
각각 시간 복잡도는
Arrays.sort() - 평균: O(nlong(n)) / 최악: O(n^2)
Collections.sort() - 평균, 최악: O(nlong(n))
평균적으로 Collections.sort()가 더 빠르다.
테스트 해본 코드
public class SortTest {
static int[] intArrays = {5, 10, 24, 77, 0};
static List<Integer> integerList = new ArrayList<>();
List<Member> members = new ArrayList<>();
@BeforeAll
static void beforeAll() {
StringBuffer sb = new StringBuffer();
sb.append("sort before = ");
for (int i : intArrays) {
integerList.add(i);
sb.append(i + " ");
}
System.out.println(sb.toString());
}
@Test
@DisplayName("Array.sort() 정렬")
void arraySort() {
Arrays.sort(intArrays);
Assertions.assertArrayEquals(new int[]{0, 5, 10, 24, 77}, intArrays);
}
@Test
@DisplayName("Collection.sort() 정렬")
void collectionSort() {
Collections.sort(integerList);
List<Integer> testList = new ArrayList<>();
testList.add(0);
testList.add(5);
testList.add(10);
testList.add(24);
testList.add(77);
Assertions.assertIterableEquals(testList, integerList);
}
public class Member implements Comparable<Member> {
String name;
int number;
public Member(String name, int number) {
this.name = name;
this.number = number;
}
@Override
public String toString() {
return "Member{" +
"name='" + name + '\'' +
", number=" + number +
'}';
}
// 내림차순 정렬
@Override
public int compareTo(Member o) {
if (this.number > o.number) {
return -1;
} else if (this.number < o.number) {
return 1;
} else {
return 0;
}
}
}
@Test
@DisplayName("객체 정렬")
void objectSort() {
members.add(new Member("min", 20));
members.add(new Member("test", 27));
Collections.sort(members);
System.out.println(members);
}
}
추가적으로 Assertions.assertIterableEquals
요런게 있다는 걸 알게 됬다. 근데 그냥 기본 타입일 때만 값 비교 해주고 또 Object이면 안해줘서 밑에는 일단 syso로 눈으로 확인했다.
객체의 정렬 기준을 따로 정의하고 싶어 질 때는 implements Comparable<Member>
해서 정렬 기준을 세워 줄 수 있다.