Java/컬렉션

[Java]HashSet 정렬

DevStory 2022. 6. 27.

이번 포스팅은 HastSet을 정렬하는 방법을 소개합니다.


HashSet 클래스

HashSet 클래스 정렬 방법을 소개하기 전에 HastSet 클래스에 대해 간단하게 알아봅시다.

1. HashSet 클래스는 AbstractSet 클래스를 확장하고 Set 인터페이스를 구현하는 클래스입니다. 

2. 중복 값이 저장되지 않습니다.

3. 삽입 순서가 보장되지 않습니다.

public class Main {
  public static void main(String args[]) {
    HashSet<String> hSet = new HashSet<String>();

    hSet.add("Hello");
    hSet.add("Java");
    hSet.add("Programming");

    System.out.println(hSet);
  }
}

실행 결과

[Java, Hello, Programming]

HashSet의 요소가 삽입 순서를 보장하지 않는다는 것은 정렬이 불가능하다는 의미입니다.

 

아래에서 소개하는 방법을 사용하면 간접적으로 정렬할 수 있지만, 정렬된 결과가 HashSet이 아닌 다른 타입이라는 문제가 있습니다.


방법 1. List로 변환 후 정렬

HashSet을 List로 변환 후 Collections.sort() 메서드를 사용하여 오름차순으로 정렬합니다. 정렬된 결과는 List 타입입니다.

 

다음 예제는 HashSet을 List로 변환 후 오름차순으로 정렬하는 예제입니다.

public class Main {
  public static void main(String args[]) {
    HashSet<String> hSet = new HashSet<String>();

    hSet.add("Hello");
    hSet.add("Java");
    hSet.add("Programming");

    // 정렬 전
    System.out.println("hSet: " + hSet);

    // List로 변환 후 정렬(오름차순)
    List<String> li = new ArrayList<String>(hSet);
    Collections.sort(li);

    // 정렬 후
    System.out.println("li: " + li);
  }
}

실행 결과

hSet: [Java, Hello, Programming]
li: [Hello, Java, Programming]

내림차순으로 정렬하고 싶은 경우 Colelctions.reverseOrder() 메서드를 Colelctions.sort() 메서드의 두 번째 인자로 전달합니다.

 

다음 예제는 HastSet을 List로 변환 후 내림차순으로 정렬하는 예제입니다.

public class Main {
  public static void main(String args[]) {
    HashSet<String> hSet = new HashSet<String>();

    hSet.add("Hello");
    hSet.add("Java");
    hSet.add("Programming");

    // 정렬 전
    System.out.println("hSet: " + hSet);

    // List로 변환 후 정렬(내림차순)
    List<String> li = new ArrayList<String>(hSet);
    Collections.sort(li, Collections.reverseOrder());

    // 정렬 후
    System.out.println("li: " + li);
  }
}

실행 결과

hSet: [Java, Hello, Programming]
li: [Programming, Java, Hello]

방법 2. TreeSet으로 변환

HashSet을 TreeSet으로 변환하면 자동으로 정렬됩니다.

 

다음 예제는 HastSet을 TreeSet으로 변환합니다.

public class Main {
  public static void main(String args[]) {
    HashSet<String> hSet = new HashSet<String>();

    hSet.add("Hello");
    hSet.add("Java");
    hSet.add("Programming");

    // 정렬 전
    System.out.println("hSet: " + hSet);
    
    // TreeSet으로 변환(오름차순)
    TreeSet<String> ts = new TreeSet<String>(hSet);

    // 정렬 후
    System.out.println("ts: " + ts);
  }
}

실행 결과

hSet: [Java, Hello, Programming]
ts: [Hello, Java, Programming]

내림차순으로 정렬하고 싶은 경우 Comparator 인터페이스를 구현하고 addAll() 메서드를 사용하여 HashSet의 모든 요소를 TreeSet에 추가합니다.

public class Main {
  public static void main(String args[]) {
    HashSet<String> hSet = new HashSet<String>();

    hSet.add("Hello");
    hSet.add("Java");
    hSet.add("Programming");

    // 정렬 전
    System.out.println("hSet: " + hSet);
    
    // TreeSet으로 변환(내림차순)
    TreeSet<String> ts = new TreeSet<String>(
            new Comparator<String>() {
                @Override
                public int compare(String s1, String s2) {
                    return s2.compareTo(s1);
                }
            }
    );

    // 정렬 후
    System.out.println("ts: " + ts);
  }
}

실행 결과

hSet: [Java, Hello, Programming]
ts: [Programming, Java, Hello]

방법 3. Stream API

Java 8 Version 이상인 경우 Stream API의 collect() 메서드를 사용하여 HashSet을 정렬할 수 있습니다.

public class Main {
  public static void main(String args[]) {
    HashSet<String> hSet = new HashSet<String>();

    hSet.add("Hello");
    hSet.add("Java");
    hSet.add("Programming");

    // 정렬 전
    System.out.println("hSet: " + hSet);
    
    // TreeSet으로 변환(오름차순)
    TreeSet<String> ts = hSet.stream()
                    .collect(Collectors.toCollection(TreeSet::new));

    // 정렬 후
    System.out.println("ts: " + ts);
  }
}

실행 결과

hSet: [Java, Hello, Programming]
ts: [Hello, Java, Programming]

 

 

반응형

'Java > 컬렉션' 카테고리의 다른 글

[Java]HashMap 순회하는 방법  (0) 2022.06.27
[Java]ArrayList 중복 제거  (0) 2022.06.27
[Java]ArrayList 정렬  (0) 2022.06.23
[Java]ArrayList 특정 위치에 값 추가  (0) 2022.06.23
[Java]ArrayList 반복문 사용 방법  (0) 2022.06.23

댓글