48

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

ありがとう!

4

7 に答える 7

41

ストリームの使用:

// int[] nums = {1,2,3,4,5}
Set<Integer> set = Arrays.stream(nums).boxed().collect(Collectors.toSet())
于 2020-04-25T17:30:41.653 に答える
20

質問は2つの別々の質問をします:への変換int[]とからのInteger[]作成です。どちらもJava8ストリームで簡単に実行できます。HashSet<Integer>int[]

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));
于 2016-03-20T03:15:18.793 に答える
11

いくつかのさらなる説明。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はリストを戻したいと推測できるので、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...);
于 2012-08-20T03:28:42.770 に答える
4

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

于 2012-08-19T23:34:48.053 に答える
2

ApacheCommonsでArrayUtilsを使用できます

int[] intArray  = { 1, 2, 3 };
Integer[] integerArray = ArrayUtils.toObject(intArray);
于 2012-08-19T23:11:48.060 に答える
1

もう1つのオプションは、 Eclipseコレクションのプリミティブセットを使用することです。以下に示すように、int[]をaMutableIntSetからaに簡単に変換できます。または、そのまま使用すると、メモリ効率とパフォーマンスが大幅に向上します。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コレクションのコミッターです

于 2017-01-28T07:37:26.597 に答える
0

以下のスニペットを使用して、配列からセットに要素を追加するだけです。

public class RemoveDuplicateElements {

    public static void main(String args[]){
        int array[] =  {0,1,2,3,4,5,6,7,8,9,1,2,3,4,5};
        Set <Integer> abc = new HashSet <Integer>();
        for (Integer t:array){  
            abc.add(t); 
        }       
        System.out.println("sampleSet"+abc);  
    }

}
于 2020-02-17T13:33:11.010 に答える