Saya baru ke Jawa dan sangat bingung.
Saya memiliki dataset besar dengan panjang 4 int[]
dan saya ingin menghitung berapa kali setiap kombinasi 4 bilangan bulat terjadi. Ini sangat mirip dengan menghitung frekuensi kata dalam dokumen.
Saya ingin membuat Map<int[], double>
yang memetakan setiap int [] ke jumlah yang sedang berjalan karena daftar diulangi, tetapi Peta tidak menggunakan tipe primitif.
jadi saya membuat Map<Integer[], Double>
data saya disimpan ArrayList<int[]>
jadi loop saya harus seperti ini
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);
}
}
Saya tidak yakin kode apa yang saya butuhkan di komentar untuk membuat pekerjaan ini untuk mengkonversi int[]
menjadi Integer[]
. Atau mungkin saya pada dasarnya bingung tentang cara yang tepat untuk melakukan ini.
java
arrays
generics
collections
Jonik
sumber
sumber
Jawaban:
Native Java 8 (satu baris)
Dengan Java 8,
int[]
dapat dikonversi denganInteger[]
mudah:Seperti yang dinyatakan orang lain,
Integer[]
biasanya bukan kunci peta yang baik. Namun sejauh konversi berjalan, kami sekarang memiliki kode asli dan relatif bersih.sumber
List<Integer> list = IntStream.of(q).boxed().collect(Collectors.toList());
Integer[]
saya benar-benar menyarankan menggunakan sintaks berikut:Integer[] boxed = IntStream.of(unboxed).boxed().toArray();
Dengan cara yang sama seperti @NwDxIntStream.of
meneleponArrays.stream
. Saya pikir itu turun ke preferensi pribadi - Saya lebih suka satu fungsi yang ditimpa, beberapa suka menggunakan kelas yang lebih eksplisit.the "new" method (constructor) of the Integer[] class
.Jika Anda ingin mengonversikan
int[]
keInteger[]
, tidak ada cara otomatis untuk melakukannya di JDK. Namun, Anda dapat melakukan sesuatu seperti ini:Jika Anda memiliki akses ke perpustakaan lang Apache , maka Anda dapat menggunakan
ArrayUtils.toObject(int[])
metode seperti ini:sumber
value
sementara variabel pengindeksani
ada.for (int i...)
Perulangan tradisional akan lebih efisien di sini.Agaknya Anda ingin kunci peta cocok dengan nilai elemen, bukan identitas array. Dalam hal ini Anda menginginkan semacam objek yang mendefinisikan
equals
danhashCode
seperti yang Anda harapkan. Cara termudah adalah mengonversi menjadiList<Integer>
, baikArrayList
penggunaan atau lebih baikArrays.asList
. Lebih baik dari itu Anda bisa memperkenalkan kelas yang mewakili data (mirip denganjava.awt.Rectangle
tetapi saya sarankan membuat variabel pribadi akhir, dan kelas juga final).sumber
Menggunakan for-loop reguler tanpa perpustakaan eksternal:
Konversi int [] ke Integer []:
Konversikan Integer [] ke int []:
sumber
Saya salah dalam jawaban sebelumnya. Solusi yang tepat adalah dengan menggunakan kelas ini sebagai kunci dalam peta yang membungkus int aktual [].
dan ubah kode Anda seperti ini:
sumber
Konversi int [] ke Integer []
Konversi Integer [] ke int []
sumber
newArray[i] = ids[i];
dan pada yang keduanewArray[i] = WrapperArray[i]
:)Daripada menulis kode Anda sendiri, Anda dapat menggunakan IntBuffer untuk membungkus int [] yang ada tanpa harus menyalin data ke dalam array Integer
IntBuffer mengimplementasikan sebanding sehingga Anda dapat menggunakan kode yang sudah Anda tulis. Peta secara formal membandingkan kunci sehingga a.equals (b) digunakan untuk mengatakan dua kunci sama, sehingga dua IntBuffers dengan array 1,2,3 - bahkan jika array berada di lokasi memori yang berbeda - dikatakan sama dan akan bekerja untuk kode frekuensi Anda.
}
Semoga itu bisa membantu
sumber
Tidak yakin mengapa Anda membutuhkan Dobel di peta Anda. Dalam hal apa yang Anda coba lakukan, Anda memiliki int [] dan Anda hanya ingin menghitung berapa kali setiap urutan terjadi? Mengapa ini membutuhkan Double?
Apa yang akan saya lakukan adalah membuat pembungkus untuk array int dengan .equals dan .hashCode metode yang tepat untuk menjelaskan fakta bahwa objek int [] itu sendiri tidak mempertimbangkan data dalam versi metode ini.
Dan kemudian gunakan multiset google jambu, yang dimaksudkan tepat untuk tujuan penghitungan kejadian, selama jenis elemen yang Anda masukkan di dalamnya memiliki metode .eash dan .hashCode yang tepat.
Lalu, untuk mendapatkan hitungan untuk kombinasi tertentu:
sumber
IntArrayWrapper
jelas merupakan pendekatan yang tepat untuk menggunakanint[]
array sebagai kunci hash, tetapi harus disebutkan bahwa tipe seperti itu sudah ada ... Anda dapat menggunakannya untuk membungkus array dan tidak hanya memilikinyahashCode
danequals
, bahkan sebanding.Pembaruan: Meskipun kompilasi di bawah ini, ia melempar
ArrayStoreException
pada saat runtime. Sangat buruk. Saya akan membiarkannya untuk referensi di masa mendatang.Mengubah sebuah
int[]
, menjadiInteger[]
:Saya harus mengakui bahwa saya sedikit terkejut bahwa ini dikompilasi, diberikan
System.arraycopy
tingkat rendah dan segalanya, tetapi ternyata demikian. Setidaknya dalam java7.Anda dapat mengonversi cara lain dengan mudah.
sumber
Ini bekerja seperti pesona!
sumber
Konversi int [] ke Integer []:
sumber
kamu tidak perlu
int[]
adalah objek dan dapat digunakan sebagai kunci di dalam peta.adalah definisi yang tepat dari peta frekuensi.
Ini salah :-). Solusi yang tepat diposting juga :-).
sumber
frequencies.containsKey(q)
akan selalu salah bahkan jika sayaput
memiliki array yang sama dua kali - apakah ada kesalahan di sini yang melibatkan definisi java tentang persamaan dengan int []?Cukup gunakan:
sumber