웹사이트 검색

Java에서 집합을 목록으로 변환하는 방법


Java의 목록은 순서가 지정된 데이터 모음인 반면 집합은 순서가 없는 데이터 모음입니다. 목록에는 중복 항목이 있을 수 있지만 집합에는 없습니다. 두 데이터 구조는 서로 다른 시나리오에서 유용합니다.

집합을 목록으로 변환하는 방법을 아는 것이 유용합니다. 정렬되지 않은 데이터를 정렬된 데이터로 변환할 수 있습니다.

세트 초기화

집합을 초기화하고 여기에 몇 가지 요소를 추가해 봅시다.

import java.util.*;

public class Main {

    public static void main(String[] args)
    {
        Set<Integer> a = new HashSet<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(1);
        System.out.println(a);
    }
}

HashSet의 add() 메서드는 집합에 요소를 추가합니다. 요소는 구별됩니다. 세트가 순서가 없기 때문에 삽입 순서에 따라 요소를 가져올 방법이 없습니다.

Java에서 집합을 목록으로 변환

집합을 목록으로 변환해 봅시다. 여러 가지 방법이 있습니다. 각 방법은 서로 다르며 이러한 차이점은 미묘합니다.

1. Set 인수가 있는 목록 생성자

집합을 목록으로 변환하는 가장 간단한 방법은 목록을 만드는 동안 집합을 인수로 전달하는 것입니다. 이것은 생성자를 호출하고 그 이후부터는 생성자가 나머지를 처리합니다.

import java.util.*;

public class Main {

    public static void main(String[] args)
    {
        Set<Integer> a = new HashSet<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(1);

     List<Integer> arr = new ArrayList<>(a);
     System.out.println(arr);
     System.out.println(arr.get(1));

    }
}

집합이 목록으로 변환되었으므로 이제 요소가 정렬됩니다. 즉, get() 메서드를 사용하여 인덱스로 요소에 액세스할 수 있습니다.

2. 기존의 for 루프 사용

집합에서 목록으로 요소를 명시적으로 복사하기 위해 좋은 예전 for 루프를 사용할 수 있습니다.

import java.util.*;

public class Main {

    public static void main(String[] args)
    {
        Set<Integer> a = new HashSet<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(1);

     List<Integer> arr = new ArrayList<>(a);
        for (int i : a)
            arr.add(i);
        System.out.println(arr);
        System.out.println(arr.get(1));
    }   
}

For 루프는 설정된 요소를 요소별로 살펴보고 요소를 목록에 추가합니다.

3. addAll() 메서드 나열

목록에는 한 번에 목록에 여러 값을 추가하는 addAll()이라는 메서드가 있습니다. 두 목록을 병합하는 데 사용한 이 작업을 기억할 수 있습니다. addAll()은 집합의 요소를 목록에 추가하는 데도 작동합니다.

import java.util.*;

public class Main {

    public static void main(String[] args)
    {
        Set<Integer> a = new HashSet<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(1);

     List<Integer> arr = new ArrayList<>();
        arr.addAll(a);
        System.out.println(arr);
        System.out.println(arr.get(1));
    }
}

4. 스트림 API collect() 메소드

Stream.collect()는 Java 8부터 사용할 수 있습니다. ToList 수집기는 모든 스트림 요소를 목록 인스턴스로 수집합니다.

import java.util.*;
import java.util.stream.Collectors;


public class Main {

    public static void main(String[] args)
    {
        Set<Integer> a = new HashSet<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(1);

     List<Integer> arr;

        arr = a.stream().collect(Collectors.toList());
        System.out.println(arr);
        System.out.println(arr.get(1));
    }
}

stream.collect()에 대한 문서에는 반환된 목록의 유형, 가변성, 직렬화 가능성 또는 스레드 안전성에 대한 보장이 없다고 언급되어 있습니다. 반환된 목록에 대한 추가 제어가 필요한 경우 toCollection(공급자)을 사용합니다.

목록 유형을 지정하려면 toCollection(ArrayList::new)를 사용하십시오.

import java.util.*;
import java.util.stream.Collectors;


public class Main {

    public static void main(String[] args)
    {
        Set<Integer> a = new HashSet<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(1);

     List<Integer> arr;

  arr = a.stream().collect(Collectors.toCollection(ArrayList::new));
        System.out.println(arr);
        System.out.println(arr.get(1));
    }
}

권장 자료: Java의 스트림

5. List.copyOf() 메서드

Java 10 이후 목록에는 copyOf() 메서드가 있습니다. 이 메서드는 지정된 Collection의 요소를 반복 순서로 포함하는 수정 불가능한 목록을 반환합니다. 목록에는 null 요소가 포함될 수 없습니다. 집합에 'null'이 포함된 경우 메서드는 null 포인터 예외를 반환합니다.

import java.util.*;
import java.util.stream.Collectors;


public class Main {

    public static void main(String[] args)
    {
        Set<Integer> a = new HashSet<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(1);

     List<Integer> arr;

        arr = List.copyOf(a);
        System.out.println(arr);
        System.out.println(arr.get(1));
    }
}

집합에 null을 추가하고 목록으로 변환하려고 합니다.

import java.util.*;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args)
    {
        Set<Integer> a = new HashSet<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(1);
        a.add(null);

     List<Integer> arr;

        arr = List.copyOf(a);
        System.out.println(arr);
        System.out.println(arr.get(1));
    }
}

변경할 수 없는 목록에 요소를 추가하려고 하면 다음과 같은 오류가 발생합니다.

addAll() 메서드를 사용하여 null 요소가 있는 집합을 목록으로 변환:

import java.util.*;
import java.util.stream.Collectors;


public class Main {

    public static void main(String[] args)
    {
        Set<Integer> a = new HashSet<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(1);
        a.add(null);

     List<Integer> arr = new ArrayList<>();
     arr.addAll(a);

      //  arr = List.copyOf(a);
        System.out.println(arr);
        System.out.println(arr.get(1));
    }
}

목록의 시작 부분에 null이 나타납니다.

결론

집합을 목록으로 변환하는 몇 가지 정말 흥미로운 방법을 보았습니다. 각 메서드에서 생성되는 목록 유형에 주의를 기울이는 것이 중요합니다. copyOf() 메서드와 마찬가지로 변경 불가능한 목록을 생성하고 null 요소를 처리할 수 없습니다. 반면 stream.collect()는 아무 것도 보장하지 않습니다. 생성자와 addAll()은 배치 중에서 가장 신뢰할 수 있습니다.