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()Javadocに明確に記載されているメソッドを使用します。
ローンの侯爵


Java 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 2016年

8
Java 7から使用できますがString[] GPXFILES1 = myset.toArray(new String[0])、これをお勧めします。答えを更新してください。「OpenJDK 6の最新のアップデート以降、この呼び出しは内在化され、空の配列バージョンのパフォーマンスが前のサイズのバージョンと同じになり、場合によってはさらに良くなりました。また、前のサイズの配列を渡すことは、同時または同期されたコレクションにとって危険操作中にコレクションが同時に縮小された場合、サイズとtoArray呼び出しの間でデータ競合が発生し、配列の最後に余分なnullが発生する可能性があります。」-Javaコミュニティから引用。
チャイタンヤ2018

6
この回答に最初に出会い、その後さらに調査を行うと、上記のコメントが正しいことを裏付ける証拠がいくつかあります。受け入れられた回答は古くなっています。次のリンクの例を参考にしてください:stackoverflow.com/questions/9863742/…、およびそのSOからのリンクはshipilev.net/blog/2016/arrays-wisdom-ancientsに投稿してください
RMSD 2018年

60

Java 11

インターフェイスの新しいデフォルトtoArrayメソッドをCollection使用すると、コレクションの要素を、目的のランタイムタイプの新しく作成された配列に転送できます。それはとりIntFunction<T[]> generator引数としてとして使用することができます。

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

すでに同様のメソッドがCollection.toArray(T[])あり、この追加はnullメソッドへの参照があいまいになるため、引数として渡すことができなくなりました。ただし、どちらの方法でもNPEがスローされるため、問題はありません。

Java 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])
JakubPomykała17年

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のすべてのキーを文字列の配列に格納する必要があります。使用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.