web-dev-qa-db-ja.com

Java int [] array to HashSet <Integer>

私は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 ...

ありがとう!

26
Robottinosino

さらなる説明。 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...);
13
Matt

質問は、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));
7
Jeffrey Bosboom

または、簡単に Guava を使用して_int[]_を_List<Integer>_に変換できます。

Ints.asList(int...)

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であるかどうかは指定されていません。

5
dantuch

ArrayUtilsは Apache Commons で使用できます。

int[] intArray  = { 1, 2, 3 };
Integer[] integerArray = ArrayUtils.toObject(intArray);
3
Reimeus

別のオプションは、 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コレクションのコミッターです

1
Donald Raab