Saya sedang mengerjakan kelas matriks renggang yang perlu menggunakan array LinkedList
untuk menyimpan nilai matriks. Setiap elemen dari array (yaitu masing-masing LinkedList
) mewakili baris matriks. Dan, setiap elemen dalam LinkedList
array mewakili kolom dan nilai yang disimpan.
Di kelas saya, saya memiliki deklarasi array sebagai:
private LinkedList<IntegerNode>[] myMatrix;
Dan, dalam konstruktor saya untuk SparseMatrix
, saya mencoba mendefinisikan:
myMatrix = new LinkedList<IntegerNode>[numRows];
Kesalahan yang akhirnya saya dapatkan adalah
Tidak dapat membuat larik umum dari
LinkedList<IntegerNode>
.
Jadi, saya punya dua masalah dengan ini:
- Apa yang saya lakukan salah, dan
- Mengapa tipe dapat diterima dalam deklarasi untuk larik jika tidak dapat dibuat?
IntegerNode
adalah kelas yang telah saya buat. Dan, semua file kelas saya dikemas bersama.
class IntegerNodeList extends List<IntegerNode> {}
Untuk beberapa alasan Anda harus memasukkan tipe dan membuat deklarasi seperti ini:
sumber
Selain dari masalah sintaks, tampaknya aneh bagi saya untuk menggunakan array dan daftar tertaut untuk mewakili matriks. Untuk dapat mengakses sel sembarang dari matriks, Anda mungkin menginginkan larik aktual atau setidaknya sebuah
ArrayList
untuk menahan baris, karenaLinkedList
harus melintasi seluruh daftar dari elemen pertama ke elemen tertentu, sebuahO(n)
operasi, sebagai lawan dari banyak. lebih cepatO(1)
denganArrayList
atau array yang sebenarnya.Karena Anda menyebutkan matriks ini jarang, mungkin cara yang lebih baik untuk menyimpan data adalah sebagai peta peta, di mana kunci di peta pertama mewakili indeks baris, dan nilainya adalah peta baris yang kuncinya adalah indeks kolom , dengan nilai menjadi kelas IntegerNode Anda. Jadi:
Jika Anda ingin dapat melintasi matriks baris demi baris, Anda dapat membuat peta baris tipe a
TreeMap
, dan sama untuk melintasi kolom dalam urutan indeks, tetapi jika Anda tidak membutuhkan kasus tersebut,HashMap
lebih cepat dariTreeMap
. Metode pembantu untuk mendapatkan dan menyetel sel arbitrer, menangani nilai null yang tidak disetel, tentu saja akan berguna.sumber
sumber
casting dengan cara ini berhasil tetapi masih meninggalkan Anda dengan peringatan buruk:
"Keamanan jenis: Ekspresi daftar jenis [] membutuhkan konversi yang tidak dicentang .."
adalah ide yang cerdas untuk menghindari peringatan tersebut. mungkin sedikit lebih baik adalah menggunakan antarmuka untuk itu:
kemudian
mengkompilasi tanpa peringatan.
tidak terlihat terlalu buruk, bukan?
sumber
List<IntegerNode>[] myMatrix = new IntegerNodeList[numRows];
Ini memiliki masalah yang halus namun penting. Anda hanya dapat memasukkanIntegerNodeList
array.myMatrix[i] = new ArrayList<IntegerNode>();
akan melemparArrayStoreException
.Tidak ada peringatan apapun. NetBeans 6.9.1, jdk1.6.0_24
sumber
Tidak ada pembuatan array generik di Java 1.5 (atau 1.6 sejauh yang saya tahu). Lihat https://community.oracle.com/message/4829402 .
sumber
Jika saya melakukan hal berikut, saya mendapatkan pesan kesalahan yang dimaksud
Tetapi jika saya hanya menghapus jenis daftar di deklarasi itu tampaknya memiliki fungsionalitas yang diinginkan.
Apakah kedua pernyataan ini sangat berbeda dengan cara yang tidak saya sadari?
EDIT
Ah, sepertinya saya sudah mengalami masalah ini sekarang.
Iterasi atas matriks dan menginisialisasi daftar dalam loop-for tampaknya berhasil. Padahal itu tidak seideal beberapa solusi lain yang ditawarkan.
sumber
Anda memerlukan array List, salah satu alternatifnya adalah mencoba:
Kemudian
node_array[i]
simpan simpul kepala (pertama) dari aArrayList<IntegerNode>
atauLinkedList<IntegerNode>
(apa pun implementasi daftar favorit Anda).Di bawah desain ini, Anda kehilangan metode akses acak
list.get(index)
, tetapi kemudian Anda masih bisa melintasi daftar yang dimulai dengan penyimpanan node head / fist dalam tipe safe array.Ini mungkin pilihan desain yang dapat diterima tergantung pada kasus penggunaan Anda. Misalnya, saya menggunakan desain ini untuk mewakili daftar grafik kedekatan, dalam banyak kasus penggunaan, ini memerlukan melintasi daftar ketetanggaan untuk titik tertentu alih-alih akses acak beberapa titik dalam daftar.
sumber