web-dev-qa-db-ja.com

Javaでint []をInteger []に変換するには?

私はJavaが初めてで、非常に混乱しています。

長さ4 int[]の大きなデータセットがあり、4つの整数の特定の組み合わせが発生する回数をカウントしたい。これは、ドキュメント内のWordの頻度を数えることに非常に似ています。

リストが繰り返されるときに各int []を実行中のカウントにマップするMap<int[], double>を作成したいのですが、Mapはプリミティブ型を取りません。

だから私はMap<Integer[], Double>を作りました

データはArrayList<int[]>として保存されるため、ループは次のようになります。

ArrayList<int[]> data = ... // load a dataset`

Map<Integer[], Double> frequencies = new HashMap<Integer[], Double>();

for(int[] q : data) {

    // **DO SOMETHING TO convert q from int[] to Integer[] so I can put it in the map

    if(frequencies.containsKey(q)) {
    frequencies.put(q, tfs.get(q) + p);
    } else {
        frequencies.put(q, p);
    }
}

コメントでint[]Integer[]に変換するために必要なコードがわからない。または、これを行う正しい方法について根本的に混乱しているかもしれません。

142
John

ネイティブJava 8(1行)

Java 8を使用すると、int[]Integer[]に簡単に変換できます。

int[] data = {1,2,3,4,5,6,7,8,9,10};

// To boxed array
Integer[] what = Arrays.stream( data ).boxed().toArray( Integer[]::new );
Integer[] ever = IntStream.of( data ).boxed().toArray( Integer[]::new );

// To boxed list
List<Integer> you  = Arrays.stream( data ).boxed().collect( Collectors.toList() );
List<Integer> like = IntStream.of( data ).boxed().collect( Collectors.toList() );

他の人が述べたように、Integer[]は通常、適切なマップキーではありません。しかし、変換に関しては、比較的クリーンでネイティブなコードができました。

153
Sheepy

int[]Integer[]に変換する場合、JDKで自動化する方法はありません。ただし、次のようなことができます。

int[] oldArray;

... // Here you would assign and fill oldArray

Integer[] newArray = new Integer[oldArray.length];
int i = 0;
for (int value : oldArray) {
    newArray[i++] = Integer.valueOf(value);
}

Apache lang ライブラリにアクセスできる場合、次のように ArrayUtils.toObject(int[]) メソッドを使用できます。

Integer[] newArray = ArrayUtils.toObject(oldArray);
75
Eddie

外部ライブラリなしで通常のforループを使用する:

int []をInteger []:に変換

int[] primitiveArray = {1, 2, 3, 4, 5};
Integer[] objectArray = new Integer[primitiveArray.length];

for(int ctr = 0; ctr < primitiveArray.length; ctr++) {
    objectArray[ctr] = Integer.valueOf(primitiveArray[ctr]); // returns Integer value
}

整数[]を整数[]に変換:

Integer[] objectArray = {1, 2, 3, 4, 5};
int[] primitiveArray = new int[objectArray.length];

for(int ctr = 0; ctr < objectArray.length; ctr++) {
    primitiveArray[ctr] = objectArray[ctr].intValue(); // returns int value
}
8
silver

おそらく、マップのキーが配列のIDではなく要素の値に一致するようにする必要があります。その場合、予想どおりequalsおよびhashCodeを定義する何らかのオブジェクトが必要です。最も簡単なのは、List<Integer>に変換することです。ArrayListまたはArrays.asListを使用することをお勧めします。それよりも、データを表すクラスを導入できます(Java.awt.Rectangleに似ていますが、変数をprivate finalにし、クラスもfinalにすることをお勧めします)。

前の答えが間違っていました。適切な解決策は、実際のint []をラップするマップのキーとしてこのクラスを使用することです。

public class IntArrayWrapper {
        int[] data;

        public IntArrayWrapper(int[] data) {
            this.data = data;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            IntArrayWrapper that = (IntArrayWrapper) o;

            if (!Arrays.equals(data, that.data)) return false;

            return true;
        }

        @Override
        public int hashCode() {
            return data != null ? Arrays.hashCode(data) : 0;
        }
    }

次のようにコードを変更します。

   Map<IntArrayWrapper, Double > freqs = new HashMap<IntArrayWrapper, Double>();

    for (int[] data : datas) {
        IntArrayWrapper wrapper = new IntArrayWrapper(data);

        if ( freqs.containsKey(wrapper)) {
            freqs.put(wrapper, freqs.get(wrapper) + p);
        }

        freqs.put(wrapper, p);
    }
6
Mihai Toader
  1. Int []をInteger []に変換します

    public static Integer[] toConvertInteger(int[] ids) {
    
      Integer[] newArray = new Integer[ids.length];
         for (int i = 0; i < ids.length; i++) {
           newArray[i] = Integer.valueOf(ids[i]);
         }
       return newArray;
    }
    
  2. Integer []をint []に変換します

    public static int[] toint(Integer[] WrapperArray) {
    
       int[] newArray = new int[WrapperArray.length];
          for (int i = 0; i < WrapperArray.length; i++) {
             newArray[i] = WrapperArray[i].intValue();
          }
       return newArray;
    }
    
6
Harsh

独自のコードを記述する代わりに、IntBufferを使用して、データを整数配列にコピーすることなく、既存のint []をラップできます。

int[] a = {1,2,3,4};
IntBuffer b = IntBuffer.wrap(a);

IntBufferは同等のものを実装しているため、すでに作成したコードを使用できます。正式なマップは、a.equals(b)を使用して2つのキーが等しいことを示すようにキーを比較します。周波数コードに対応します。

ArrayList<int[]> data = ... // load a dataset`

Map<IntBuffer, Double> frequencies = new HashMap<IntBuffer, Double>();

for(int[] a : data) {

    IntBuffer q = IntBuffer.wrap(a);

    if(frequencies.containsKey(q)) {
        frequencies.put(q, tfs.get(q) + p);
    } else {
        frequencies.put(q, p);
    }

}

役立つことを願っています

3
Chris

マップにDoubleが必要な理由がわかりません。あなたがやろうとしていることに関しては、int []があり、各シーケンスが発生する回数のカウントが必要ですか?とにかくDoubleが必要なのはなぜですか?

私がやることは、適切な.equalsおよび.hashCodeメソッドを使用してint配列のラッパーを作成し、int []オブジェクト自体がこれらのメソッドのバージョンのデータを考慮しないという事実を説明することです。

public class IntArrayWrapper {
    private int values[];

    public IntArrayWrapper(int[] values) {
        super();
        this.values = values;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + Arrays.hashCode(values);
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        IntArrayWrapper other = (IntArrayWrapper) obj;
        if (!Arrays.equals(values, other.values))
            return false;
        return true;
    }

}

そして、グーグルグアバのマルチセットを使用します。これは、挿入する要素タイプに適切な.equalsおよび.hashCodeメソッドがある限り、出現回数をカウントすることを目的としています。

List<int[]> list = ...;
HashMultiset<IntArrayWrapper> multiset = HashMultiset.create();
for (int values[] : list) {
    multiset.add(new IntArrayWrapper(values));
}

次に、特定の組み合わせのカウントを取得するには:

int cnt = multiset.count(new IntArrayWrapper(new int[] { 0, 1, 2, 3 }));
2
Matt

これは魅力的でした!

int[] mInt = new int[10];
Integer[] mInteger = new Integer[mInt.length];

List<Integer> wrapper = new AbstractList<Integer>() {
    @Override
    public int size() {
        return mInt.length;
    }

    @Override
    public Integer get(int i) {
        return mInt[i];
    }
};

wrapper.toArray(mInteger);
2
Itamar Borges

更新:以下はコンパイルされますが、実行時にArrayStoreExceptionをスローします。残念な。将来の参考のためにそのままにしておきます。


int[]からInteger[]への変換:

int[] old;
...
Integer[] arr = new Integer[old.length];
System.arraycopy(old, 0, arr, 0, old.length);

System.arraycopyが低レベルであり、すべてのものであることを考えると、これがコンパイルされることに少し驚いたことを認めなければなりません。少なくともJava7では。

他の方法も同様に簡単に変換できます。

1
Thomas Ahle