私はintの配列を持っています:
int[] a = {1, 2, 3};
私はそれから型付きセットが必要です:
Set<Integer> s;
次のことを行う場合:
s = new HashSet(Arrays.asList(a));
もちろん、それは私が意味すると思います:
List<int[]>
私が意味したのに対し:
List<Integer>
これは、intがプリミティブであるためです。 Stringを使用した場合、すべてが機能します。
Set<String> s = new HashSet<String>(
Arrays.asList(new String[] { "1", "2", "3" }));
A) int[] a...
に
B) Integer[] a ...
ありがとう!
さらなる説明。 asListメソッドにはこのシグネチャがあります
public static <T> List<T> asList(T... a)
したがって、これを行う場合:
List<Integer> list = Arrays.asList(1, 2, 3, 4)
またはこれ:
List<Integer> list = Arrays.asList(new Integer[] { 1, 2, 3, 4 })
これらの場合、JavaはListを戻す必要があると推測できるため、typeパラメーターに入力します。つまり、メソッド呼び出しにIntegerパラメーターが必要です。 intからIntegerへの値を自動ボックス化して問題ありません。
ただし、これは機能しません
List<Integer> list = Arrays.asList(new int[] { 1, 2, 3, 4} )
原始からラッパーへの強制(つまり、int []からInteger []へ)が言語に組み込まれていないためです(なぜこれを行わなかったのかはわかりませんが、しませんでした)。
結果として、各プリミティブ型は、オーバーロードされた独自のメソッドとして処理する必要があります。これは、commonsパッケージが行うことです。すなわち。
public static List<Integer> asList(int i...);
質問は、2つの個別の質問をします。変換int[]
からInteger[]
およびHashSet<Integer>
からint[]
。両方ともJava 8ストリームで簡単に行えます:
int[] array = ...
Integer[] boxedArray = IntStream.of(array).boxed().toArray(Integer[]::new);
Set<Integer> set = IntStream.of(array).boxed().collect(Collectors.toSet());
//or if you need a HashSet specifically
HashSet<Integer> hashset = IntStream.of(array).boxed()
.collect(Collectors.toCollection(HashSet::new));
または、簡単に Guava を使用して_int[]
_を_List<Integer>
_に変換できます。
asList
public static List<Integer> asList(int... backingArray)
Arrays.asList(Object[])
と同様に、指定された配列に連動する固定サイズのリストを返します。リストはList.set(int, Object)
をサポートしますが、値をnull
に設定しようとするとNullPointerException
になります。返されたリストは、書き込まれた、または読み取られた
Integer
オブジェクトの値を保持しますが、IDは保持しません。たとえば、list.get(0) == list.get(0)
が返されたリストに対してtrueであるかどうかは指定されていません。
ArrayUtilsは Apache Commons で使用できます。
int[] intArray = { 1, 2, 3 };
Integer[] integerArray = ArrayUtils.toObject(intArray);
別のオプションは、 Eclipse Collections のプリミティブセットを使用することです。以下に示すように、int[]
をMutableIntSet
からSet<Integer>
またはInteger[]
に簡単に変換できます。または、MutableIntSet
をそのまま使用できます。はるかにメモリ効率とパフォーマンスが向上します。
int[] a = {1, 2, 3};
MutableIntSet intSet = IntSets.mutable.with(a);
Set<Integer> integerSet = intSet.collect(i -> i); // auto-boxing
Integer[] integerArray = integerSet.toArray(new Integer[]{});
Int配列からInteger配列に直接移動して順序を保持する場合、これは機能します。
Integer[] integers =
IntLists.mutable.with(a).collect(i -> i).toArray(new Integer[]{});
注:私はEclipseコレクションのコミッターです