Buat Array Daftar Array

175

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?

pengguna
sumber
8
Jangan gabungkan array dan koleksi. Bahkan, jangan gunakan array kecuali Anda berurusan dengan primitif (atau Anda tahu apa yang Anda lakukan). Array adalah mimpi buruk kegunaan, mereka membuat kode Anda tidak dapat dipelihara.
Sean Patrick Floyd
13
@SeanPatrickFloyd Bisakah Anda menjelaskan mengapa array adalah mimpi buruk kegunaan?
pengguna
3
@ Crucifiedsoul yakin. sebuah array tidak dapat tumbuh, Anda tidak bisa memasukkan apa pun ke dalam array, sebuah array tidak mengesampingkan metode standar seperti sama dengan kode hash atau toString dll.
Sean Patrick Floyd
9
@SeanPatrickFloyd oke - yah saya perlu empat daftar array - Saya berencana untuk mengakses masing-masing dengan indeks - Saya tidak perlu array luar untuk tumbuh atau menyusut - Saya tidak perlu toString atau kode hash, dll - - Bagi saya, array adalah pilihan yang jelas di sini - apa yang akan Anda rekomendasikan sebagai alternatif dalam situasi ini?
BrainSlugs83
4
Oke ini pertanyaan lama tapi saya tetap akan bertanya dan melihat apakah ada yang menjawab. Saya melihat semua orang berbicara tentang mengapa array daftar adalah ide yang buruk, praktik pengkodean yang buruk, dll. Saya melihat ini karena saya sedang belajar untuk melakukan rantai hash, dan definisi rantai hash adalah array daftar! Jadi, bagaimana tepatnya struktur data pemrograman pusat dapat menjadi praktik pengkodean yang mengerikan? Atau apakah ini termasuk dalam kategori IYKWYD yang disebutkan oleh @Sean?
jimboweb

Jawaban:

142

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);
MByD
sumber
20
List<List<Individual>> group = new ArrayList<List<Individual>>();mungkin akan lebih baik.
Tom Hawtin - tackline
4
Apa artinya "tidak dapat membuat array tipe generik"? Itu tidak masuk akal bagi saya karena ini bukan obat generik jika Anda memberikan apa yang seharusnya dimiliki, bukan?
Andy
5
Saya terkejut dengan upvotes karena tidak menjawab pertanyaan (yaitu saya ingin melakukan ini, bagaimana saya bisa melakukannya). Kecuali mungkin untuk kalimat pertama.
Florian F
15
mengapa referensi Daftar lebih baik daripada ArrayList?
shifu
3
@shifu a Daftar referensi lebih umum daripada ArrayList; mendeklarasikan sebagai Daftar meringkas API ArrayList yang melampaui API Daftar. Itu bagus karena menyederhanakan referensi ke Daftar yang API mungkin memiliki keseluruhan dari apa yang diperlukan Daftar untuk anyways, tanpa mengacaukan API referensi itu dengan tambahan yang dimiliki ArrayList. Anda hanya boleh mendeklarasikan sebagai ArrayList jika Anda membutuhkan sesuatu yang spesifik dari API untuk tersedia melalui referensi.
cellepo
98

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];
Marcus
sumber
4
Sepertinya tidak ada yang menjelaskan dengan baik mengapa dan saya suka cuplikan Anda di atas. mengapa Anda merekomendasikan menggunakan daftar ini?
clankill3r
3
Jika grup array tidak berubah, maka pendekatan ini lebih baik, karena array lebih cepat daripada kelas Daftar <>.
Borzh
33
Terima kasih telah benar-benar menjawab pertanyaan. Tidak ada alasan logis untuk secara otomatis menganggap daftar lebih disukai daripada array tanpa konteks lebih lanjut.
Saus Spesial
3
Ada alasan mengapa ini lebih disukai daripada Jawaban @kelvincer ( ArrayList<String>[] group = new ArrayList[4])? Apa yang dilakukan oleh pemeran yang baik?
cellepo
2
Anda harus menggunakan new ArrayList<?>[N]untuk menghindari menggunakan jenis mentah.
Radiodef
80

Ini bekerja:

ArrayList<String>[] group = new ArrayList[4];
kelvincer
sumber
1
Ini memuaskan memiliki manfaat yang diinginkan bahwa menambahkan ArrayList dari sembarang Objek selain String (yaitu: ArrayList<String>bukan ArrayList<NotString>) untuk grouptidak dikompilasi
cellepo
12
Ini menghasilkan peringatan:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
matematika
24

Anda dapat membuat kelas dengan memperluas ArrayList

class IndividualList extends ArrayList<Individual> {

}

dan kemudian buat array

IndividualList[] group = new IndividualList[10];
pengguna2558221
sumber
17

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 nberbeda.

Dengan mendeklarasikan List<List<Integer>>saya perlu membuat n ArrayList<Integer>objek secara manual atau meletakkan for loop untuk membuat ndaftar atau cara lain, dengan cara apa pun akan selalu menjadi tugas saya untuk membuat ndaftar.

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?

smslce
sumber
AFAICT tampaknya semacam mentalitas kultus kargo yang disebabkan oleh sistem pengetikan yang dibawa Jawa ke meja.
BrainSlugs83
@smsIce: Ini bukan desain yang buruk. Masalahnya adalah, bahwa banyak penulis tidak membaca pertanyaan lengkap atau memahaminya dengan jelas.
testo
16

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);
Arjun Nagathankandy
sumber
2
Ketika Anda menggunakan 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.
Genhis
8

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.

Kaya
sumber
6

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

Mark Odey
sumber
Menambahkan pada posisi tertentu adalah O (n) untuk array dan ArrayList. Mengisi juga O (n) untuk kedua array dan ArrayList.
Navin
2
Menambahkan pada posisi tertentu adalah O (1) untuk array. Ini O (n) untuk ArrayList, tetapi O (1) untuk array.
aviemet
3

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];
Piotr Gwiazda
sumber
2
  1. Penciptaan dan inisialisasi

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. Akses tulis

    yourArray[i]= someArrayList;

    untuk mengakses elemen ArrayList internal:

    ((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
  3. 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);
Amr Lotfy
sumber
2

List [] listArr = ArrayList baru [4];

Di atas baris memberikan peringatan, tetapi berfungsi (yaitu menciptakan Array of ArrayList)

Ashutosh S
sumber
1

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.

Androidcoder
sumber
1
ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10]; 
Labeo
sumber
1

Anda bisa buat seperti ini ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

Anda harus membuat larik tipe non generik dan kemudian melemparkannya menjadi generik.

Tejendra
sumber
1

ArrayList<Integer>[] graph = new ArrayList[numCourses] Berhasil.

xiankun zhu
sumber
0

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>();
 }
Creative_Cimmons
sumber
0

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>();
}
Nishant Salhotra
sumber
0
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
   al[i] = new ArrayList<String>();
}
HeadAndTail
sumber
-1

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.

pengguna3539906
sumber
2
l.lengthtidak terdefinisi dalam for-loop. Ini mungkin kesalahan runtime.
bourbaki4481472
l tidak diinisialisasi untuk memiliki panjang, itu masih pointer nol ketika mencapai for loop. yaitu Daftar <e> [] l = Daftar baru [PANJANG];
Erik