Saya mencoba membangun HashMap yang akan memiliki integer sebagai kunci dan objek sebagai nilai.
Sintaks saya adalah:
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
Namun, kesalahan yang dikembalikan adalah - Kesalahan sintaks pada token "int", Dimensi yang diharapkan setelah token ini - Saya tidak mengerti mengapa saya harus menambahkan dimensi (yaitu: membuat int menjadi array) karena saya hanya perlu menyimpan satu digit sebagai kunci.
Apa yang dapat saya lakukan?
Terima kasih sebelumnya! :)
HashMap
tidak menangani primitif, hanya benda.int
menjadi nilai, bukan kuncinya.Integer
sebagai gantinya.Jawaban:
Anda tidak dapat menggunakan primitif karena HashMap menggunakan objek secara internal untuk kuncinya. Jadi Anda hanya dapat menggunakan objek yang mewarisi dari Objek (yaitu objek apa pun).
Itu adalah fungsi put () di HashMap dan seperti yang Anda lihat, ini menggunakan Object untuk K:
Ekspresi "k = e.key" harus membuatnya jelas.
Saya menyarankan untuk menggunakan pembungkus seperti Integer dan autoboxing.
sumber
Gunakan
Integer
sebagai gantinya.Java akan secara otomatis mengoksidasi
int
nilai primitif Anda keInteger
objek.Baca lebih lanjut tentang autoboxing dari dokumentasi Oracle Java.
sumber
myObject
ArrayMap
atauSimpleArrayMap
di Android untuk menghemat memori dan meningkatkan kinerja ( Informasi lebih lanjut )Untuk semua orang yang membuat kode Java untuk perangkat Android dan berakhir di sini: gunakan
SparseArray
untuk kinerja yang lebih baik;dengan ini Anda dapat menggunakan int daripada Integer seperti;
sumber
SparseArray
Jika Anda mengalokasikan sekumpulan memori boxing dan unboxing int seperti yang Anda lakukan dengan aHashMap
, vm perlu menjeda eksekusi untuk pengumpulan sampah lebih cepat. Ini penting jika Anda mencoba melakukan sesuatu dengan sering dan cepat.SparseArray
adalah O (n) (HashMap
memiliki O (1) ). Ini penting ketika jumlah elemen banyak. Penyisipan ke awal larik semacam itu jauh lebih lambat.put()
mengambilO(n)
(bukann log n
) untuk penyisipan di awal karena ia menemukan posisi dan kemudian menggeser semua elemen berikut.delete()
itu sendiri memang membutuhkanO(log n)
, tetapi penyisipan berikutnya atau iterasi melalui elemen setelah penghapusan akan membutuhkan pengumpulan sampah yang mengambilO(n)
.Anda dapat mencoba menggunakan Trove http://trove.starlight-systems.com/
TIntObjectHashMap mungkin adalah yang Anda cari.
sumber
Alasan utama dengan HashMap tidak mengizinkan primitif sebagai kunci adalah bahwa HashMap dirancang sedemikian rupa sehingga untuk membandingkan kunci, ia menggunakan metode equals () , dan metode hanya dapat dipanggil pada objek bukan pada primitif.
Jadi ketika int di-autobox ke Integer, Hashmap dapat memanggil metode equals () pada objek Integer.
Itulah mengapa, Anda harus menggunakan Integer daripada int. Maksud saya, hashmap melempar kesalahan saat meletakkan int sebagai kunci (Tidak tahu arti kesalahan yang dilemparkan)
Dan jika Anda berpikir demikian, Anda dapat membuat kinerja Map lebih cepat dengan menjadikan primitif sebagai kunci, ada pustaka bernama FastUtil yang berisi implementasi Map dengan tipe int sebagai kuncinya.
Karena itu, ini jauh lebih cepat daripada Hashmap
sumber
Map<Integer, String>
menjadiMap<Object, Object>
selama kompilasi. BTW, ada IdentityHashMap yang menggunakan==
operator untuk pemeriksa persamaan, yang masih tidak mengizinkan tipe primitif.HashMap tidak mengizinkan tipe data primitif sebagai argumen. Ia hanya bisa menerima benda begitu
tidak akan berfungsi.
Anda harus mengubah deklarasi menjadi
begitu pun saat Anda melakukan hal berikut
Tipe data primitif di-autobox ke objek Integer.
Anda dapat membaca lebih lanjut tentang autoboxing di sini http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
sumber
Jika Anda membuat kode di Android, ada SparseArray , yang memetakan integer ke objek.
sumber
gunakan int sebagai Object bukan sebagai tipe primitif
sumber
-1
. Saya tidak seperti komentar orang lain sebelum menghukum (saya tidak memberi Anda -1).Mohon gunakan
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
sumber
Array juga merupakan Objek, begitu
HashMap<int[], MyObject>
juga konstruksi valid yang menggunakan larik int sebagai kunci.Compiler tidak mengetahui apa yang Anda inginkan atau butuhkan, ia hanya melihat konstruksi bahasa yang hampir benar, dan memperingatkan apa yang hilang agar benar sepenuhnya.
sumber
Untuk seseorang yang tertarik dengan peta seperti itu karena Anda ingin mengurangi jejak autoboxing di Java dari pembungkus daripada tipe primitif, saya akan merekomendasikan untuk menggunakan koleksi Eclipse . Trove tidak lagi didukung , dan saya yakin ini adalah pustaka yang cukup tidak dapat diandalkan (meskipun ini cukup populer) dan tidak dapat dibandingkan dengan koleksi Eclipse .
Dalam contoh ini di atas IntObjectHashMap .
Karena Anda memerlukan int-> pemetaan objek , pertimbangkan juga penggunaan
YourObjectType[]
array atauList<YourObjectType>
dan nilai akses berdasarkan indeks, karena map pada dasarnya adalah array asosiatif dengan tipe int sebagai indeks.sumber