Set <String>을 String []로 변환하는 방법?


281

내가 얻을 필요가 String[]의 아웃 Set<String>,하지만 난 그것을하는 방법을 모르겠어요. 다음은 실패합니다 :

Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.

작동하도록 수정하려면 어떻게해야합니까?


5
으로 toArray()명확하게 자바 독에서 언급 한 방법.
Lorne의 후작


자바 11 : 새로운 사용하는 toArray()기본 방법 stackoverflow.com/a/32179686/1216775
akhil_mittal

답변:


461

Set#toArray(T[])같은 크기의 형식화 된 배열 인수를 사용하는 방법을 사용하십시오 .

String[] GPXFILES1 = myset.toArray(new String[myset.size()]);

다른 크기를 사용할 수도 있지만 toArray(), 제공된 인수를 재사용하는 대신 반환 할 새 배열을 작성하는 메소드 가 강제 로 사용되므로 효율성이 떨어질 수 있습니다.

의 소스 코드AbstractCollection#toArray() 도 참조하십시오 .


5
크기가 0 인 배열을 지정할 수도 있습니다. String[] GPXFILES1 = myset.toArray(new String[0]);
sactiw

1
@sactiw : 그것은 이미 다른 답변으로 덮여 있습니다. 이것이 권장되지 않는 다른 답변에 대한 의견을 읽으십시오.
BalusC

8
Java 7부터 사용할 수 있으며 String[] GPXFILES1 = myset.toArray(new String[0])권장됩니다. 답변을 업데이트하십시오. "OpenJDK 6의 최신 업데이트 이후이 호출은 내재화되어 비어있는 어레이 버전의 성능을 사전 크기 버전과 동일하고 때로는 더 좋게 만들었습니다. 또한 사전 크기의 배열을 전달하는 것은 크기와 toArray 호출 사이에 데이터 레이스가 가능하여, 작업 중에 컬렉션이 동시에 축소 된 경우 배열 끝에 널이 추가 될 수 있습니다. " -Java 커뮤니티에서 인용했습니다.
Chaitanya

6
이 답변을 먼저 다루고 더 많은 연구를 수행하면 위의 의견이 옳다는 것을 뒷받침하는 증거가 있습니다. 승인 된 답변이 오래되었습니다. stackoverflow.com/questions/9863742/… 및 SO 게시물 shipilev.net/blog/2016/arrays-wisdom-ancients의 링크에 대한 예제 링크를 사용하십시오 .
RMSD

60

자바 11

인터페이스 의 새로운 기본 toArray메소드를 Collection사용하면 콜렉션의 요소를 원하는 런타임 유형의 새로 작성된 배열로 전송할 수 있습니다. 그것은 소요 IntFunction<T[]> generator인자로와로 사용할 수 있습니다 :

 String[] array = set.toArray(String[]::new);

이미 비슷한 방법 Collection.toArray(T[])이 있으며이 추가는 더 이상 null인수 로 전달할 수 없다는 것을 의미 합니다.이 경우 해당 방법에 대한 참조가 모호하기 때문입니다. 그러나 두 방법 모두 NPE를 던지기 때문에 여전히 괜찮습니다.

자바 8

Java 8에서는 스트림 API를 사용할 수 있습니다.

String[] array = set.stream().toArray(String[]::new);

우리는 또한의 오버로드 된 버전을 사용 할 수 있습니다 toArray () 소요 IntFunction<A[]> generator로를 :

String[] array = set.stream().toArray(n -> new String[n]);

여기서 생성기 함수의 목적은 정수 (원하는 배열의 크기)를 취하여 원하는 크기의 배열을 생성하는 것입니다. 나는 개인적으로 람다 식을 사용하는 후자보다 메소드 참조를 사용하는 전자의 접근법을 선호합니다.


stream()을 사용할 필요는 없습니다 toArray(). 그것은 할 수있다set.toArray(new String[0])
야쿱 Pomykała

1
@ JakubPomykała 실제로는 좋지 않습니다. 잘못된 크기의 배열을 제공하면 내부적으로 해당 함수는 반사를 사용하여 배열의 올바른 크기를 가져와야합니다. 이 방법이 필요한 경우set.toArray(new String[set.size()]);
Debosmit Ray

42

toArray (T [] a) 메소드를 사용하십시오 .

String[] array = set.toArray(new String[0]);

26
너무 작은 크기의 배열에 toArray ()를 전달할 때 toArray () 메소드는 리플렉션을 사용하여 올바른 크기의 새 배열을 구성해야합니다. 이것은 최소한 컬렉션 자체 크기의 배열을 전달하는 것보다 성능이 현저히 떨어집니다. 따라서 허용 된 답변 [0][myset.size()]같이 교체해야합니다 .
k2col

10
@ k2col 그것은 지금 set.toArray(new String[0])보다 더 나은 성능을 가지고있는 것 같습니다set.toArray(new String[set.size()]
Xam

1
Java 7부터는이 방법이 선호됩니다. 이 의견을 참조하십시오 .
acdcjunior



1
Set<String> stringSet= new HashSet<>();
String[] s = (String[])stringSet.toArray();

0

나는 같은 상황에 직면했다.

먼저 필요한 구조를 선언하여 시작합니다.

Set<String> myKeysInSet = null; String[] myArrayOfString = null;

필자의 경우 JSON 객체가 있으며이 JSON의 모든 키를 문자열 배열에 저장해야합니다. 은 Using GSON 라이브러리를 , 내 설정에 키와 움직임을 얻을 수 JSON.keySet ()를 사용 :

myKeysInSet = json_any.keySet();

이를 통해 필요에 따라 모든 키가있는 Set 구조가 있습니다. 따라서 문자열 배열에 값을 지정하면됩니다. 아래 코드를 참조하십시오 :

myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);

이것이 StackOverflow의 첫 번째 대답이었습니다. 오류가 발생하여 죄송합니다. : D

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.