Java 자료구조

Java에서 유용하게 사용할 수 있는 자료구조와 정렬 방법을 살펴봅니다.

유용한 컬렉션

LinkedHashSet

중복을 허용하지 않으면서 삽입 순서를 유지해야 할 때 사용합니다.

Set<String> linkedSet = new LinkedHashSet<>();
linkedSet.add("first");
linkedSet.add("second");
linkedSet.add("first");  // 중복, 추가되지 않음

// 출력: first, second (삽입 순서 유지)
for (String item : linkedSet) {
    System.out.println(item);
}

특징:

  • HashSet의 성능 (O(1) 조회)
  • 삽입 순서 보장

Pair 클래스

Key-Value 쌍을 저장하는 불변(immutable) 클래스입니다.

// JavaFX의 Pair
import javafx.util.Pair;

Pair<String, Integer> pair = new Pair<>("key", 100);
String key = pair.getKey();
Integer value = pair.getValue();

특징:

  • 읽기 전용 (Readonly)
  • 값 변경 불가

SimpleEntry

Map.Entry를 구현한 클래스로, value를 변경할 수 있습니다.

import java.util.AbstractMap.SimpleEntry;

SimpleEntry<String, Integer> entry = new SimpleEntry<>("key", 100);
entry.setValue(200);  // value 변경 가능

String key = entry.getKey();
Integer value = entry.getValue();

특징:

  • setValue() 메서드로 값 변경 가능
  • Map과 함께 사용하기 좋음

컬렉션 비교

자료구조 중복 허용 순서 보장 null 허용
HashSet X X O (1개)
LinkedHashSet X 삽입 순서 O (1개)
TreeSet X 정렬 순서 X
ArrayList O 삽입 순서 O
LinkedList O 삽입 순서 O

정렬 (Comparator)

기본 원리

compare(o1, o2) 메서드에서:

  • 반환값 < 0: o1이 o2보다 앞
  • 반환값 = 0: 동일
  • 반환값 > 0: o1이 o2보다 뒤

오름차순 정렬

public int compare(Something o1, Something o2) {
    return o1.someValue() - o2.someValue();
}

값이 작을수록 앞에 위치합니다.

내림차순 정렬

public int compare(Something o1, Something o2) {
    return o2.someValue() - o1.someValue();
}

Lambda 활용

List<Person> people = new ArrayList<>();

// 나이 오름차순
people.sort((p1, p2) -> p1.getAge() - p2.getAge());

// 또는 Comparator 메서드 사용
people.sort(Comparator.comparingInt(Person::getAge));

// 이름으로 정렬
people.sort(Comparator.comparing(Person::getName));

// 역순
people.sort(Comparator.comparing(Person::getName).reversed());

다중 조건 정렬

people.sort(Comparator
    .comparing(Person::getLastName)
    .thenComparing(Person::getFirstName)
    .thenComparingInt(Person::getAge));

특정 조건으로 우선 정렬

특정 아이템을 먼저 나오게 하고 싶으면 해당 아이템의 비교 값을 작게 만듭니다.

// VIP를 먼저 정렬
people.sort((p1, p2) -> {
    int score1 = p1.isVip() ? 0 : 1;
    int score2 = p2.isVip() ? 0 : 1;
    return score1 - score2;
});

정렬 안정성

Java의 Collections.sort()Arrays.sort()는 안정 정렬(stable sort)을 사용합니다. 동일한 비교 값을 가진 요소들은 원래 순서가 유지됩니다.

정리

용도 권장 자료구조/방법
중복 제거 + 순서 유지 LinkedHashSet
Key-Value 쌍 (불변) Pair
Key-Value 쌍 (가변) SimpleEntry
커스텀 정렬 Comparator
다중 조건 정렬 Comparator.comparing().thenComparing()

Java 8 이상에서는 Comparator의 정적 메서드들을 활용하면 간결하고 읽기 쉬운 정렬 코드를 작성할 수 있습니다.