Saya ingin membuat daftar array seperti di bawah ini:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Tapi itu tidak kompilasi. Bagaimana saya bisa melakukan ini?
Saya ingin membuat daftar array seperti di bawah ini:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Tapi itu tidak kompilasi. Bagaimana saya bisa melakukan ini?
Jawaban:
Sesuai Dokumentasi Oracle :
"Anda tidak dapat membuat array tipe parameter"
Sebaliknya, Anda bisa melakukan:
ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);
Seperti yang disarankan oleh Tom Hawting - tackline, lebih baik melakukannya:
List<List<Individual>> group = new ArrayList<List<Individual>>(4);
List<List<Individual>> group = new ArrayList<List<Individual>>();
mungkin akan lebih baik.
Seperti yang disebutkan orang lain, mungkin lebih baik menggunakan daftar lain untuk menyimpan ArrayList tetapi jika Anda harus menggunakan array:
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
ArrayList<String>[] group = new ArrayList[4]
)? Apa yang dilakukan oleh pemeran yang baik?
new ArrayList<?>[N]
untuk menghindari menggunakan jenis mentah.
Ini bekerja:
ArrayList<String>[] group = new ArrayList[4];
ArrayList<String>
bukan ArrayList<NotString>
) untuk group
tidak dikompilasi
Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Anda dapat membuat kelas dengan memperluas ArrayList
class IndividualList extends ArrayList<Individual> {
}
dan kemudian buat array
IndividualList[] group = new IndividualList[10];
Saya benar-benar tidak mengerti, mengapa semua orang menyarankan tipe gen pada array khususnya untuk pertanyaan ini.
Bagaimana jika kebutuhan saya adalah mengindeks daftar nama yang n
berbeda.
Dengan mendeklarasikan List<List<Integer>>
saya perlu membuat n
ArrayList<Integer>
objek secara manual atau meletakkan for loop untuk membuat n
daftar atau cara lain, dengan cara apa pun akan selalu menjadi tugas saya untuk membuat n
daftar.
Bukankah lebih bagus jika kita mendeklarasikannya melalui casting sebagai List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
. Saya melihatnya sebagai desain yang bagus di mana orang tidak perlu membuat semua objek pengindeksan (arraylist) sendiri
Adakah yang bisa menjelaskan mengapa ini (arrayform) akan menjadi desain yang buruk dan apa kerugiannya?
Anda dapat membuat Array dari ArrayList
List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
outer[i] = new ArrayList<>();
}
Ini akan sangat membantu dalam skenario seperti ini. Anda tahu ukuran yang luar. Tetapi ukuran yang dalam bervariasi. Di sini Anda dapat membuat array dengan panjang tetap yang berisi daftar berbagai ukuran Array. Semoga ini bisa membantu Anda.
Di Java 8 dan di atasnya Anda bisa melakukannya dengan cara yang jauh lebih baik.
List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());
Lebih baik lagi menggunakan referensi metode
List<Integer>[] outer = new List[10];
Arrays.setAll(outer, ArrayList :: new);
ArrayList::new
, itu akan memanggil ArrayList(int)
contructor dengan indeks saat ini sebagai argumen - ArrayList (1), ArrayList (2), ArrayList (3) dll. Jadi, Anda akan berakhir dengan array berukuran di bawah atau di atas ukuran, tergantung pada penggunaan Anda. Saya akan mencegah menggunakannya dan sebagai gantinya lebih memilih pendekatan kedua di mana Anda memanggil konstruktor sendiri dalam ekspresi lambda Anda.
Ini berfungsi, array dari ArrayList. Cobalah memahami cara kerjanya.
import java.util.*;
public class ArrayOfArrayList {
public static void main(String[] args) {
// Put the length of the array you need
ArrayList<String>[] group = new ArrayList[15];
for (int x = 0; x < group.length; x++) {
group[x] = new ArrayList<>();
}
//Add some thing to first array
group[0].add("Some");
group[0].add("Code");
//Add some thing to Secondarray
group[1].add("In here");
//Try to output 'em
System.out.println(group[0]);
System.out.println(group[1]);
}
}
Kredit ke Kelvincer untuk beberapa kode.
Masalah dengan situasi ini adalah dengan menggunakan daftar array Anda mendapatkan kompleksitas waktu o (n) untuk menambahkan pada posisi tertentu. Jika Anda menggunakan array, Anda membuat lokasi memori dengan mendeklarasikan array Anda karena itu konstan
Anda tidak dapat membuat larik tipe generik. Buat Daftar ArrayLists:
List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();
atau jika Anda BENAR-BENAR membutuhkan array (PERINGATAN: desain yang buruk!):
ArrayList[] group = new ArrayList[4];
Penciptaan dan inisialisasi
Object[] yourArray = new Object[ARRAY_LENGTH];
Akses tulis
yourArray[i]= someArrayList;
untuk mengakses elemen ArrayList internal:
((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
Baca akses
untuk membaca elemen array i sebagai ArrayList gunakan tipe casting:
someElement= (ArrayList<YourType>) yourArray[i];
untuk elemen array i: untuk membaca elemen ArrayList di indeks j
arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);
List [] listArr = ArrayList baru [4];
Di atas baris memberikan peringatan, tetapi berfungsi (yaitu menciptakan Array of ArrayList)
Untuk mendeklarasikan array ArrayLists secara statis untuk, katakanlah, sprite posisi sebagai Poin:
ArrayList<Point>[] positionList = new ArrayList[2];
public Main(---) {
positionList[0] = new ArrayList<Point>(); // Important, or you will get a NullPointerException at runtime
positionList[1] = new ArrayList<Point>();
}
secara dinamis:
ArrayList<Point>[] positionList;
int numberOfLists;
public Main(---) {
numberOfLists = 2;
positionList = new ArrayList[numberOfLists];
for(int i = 0; i < numberOfLists; i++) {
positionList[i] = new ArrayList<Point>();
}
}
Terlepas dari peringatan dan beberapa saran rumit di sini, saya telah menemukan array ArrayLists untuk menjadi solusi elegan untuk mewakili ArrayLists terkait dari jenis yang sama.
ArrayList<Integer>[] graph = new ArrayList[numCourses]
Berhasil.
Saya menemukan ini lebih mudah digunakan ...
static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
group=new ArrayList[size];
for(int i=0;i<size;i++)
{
group[i]=new ArrayList<Individual>();
}
Kamu bisa melakukan ini :
// Buat Array jenis ArrayList
`ArrayList<Integer>[] a = new ArrayList[n];`
// Untuk setiap elemen dalam array, buat ArrayList
for(int i=0; i<n; i++){
a[i] = new ArrayList<Integer>();
}
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
al[i] = new ArrayList<String>();
}
Anda dapat membuat Daftar [] dan menginisialisasi mereka dengan for loop. kompilasi tanpa kesalahan:
List<e>[] l;
for(int i = 0; i < l.length; i++){
l[i] = new ArrayList<e>();
}
ia bekerja dengan arrayList [] l juga.
l.length
tidak terdefinisi dalam for-loop. Ini mungkin kesalahan runtime.