Bir Arraylist Dizisi Yaratın


175

Ben aşağıdaki gibi bir arraylist dizi oluşturmak istiyorum:

ArrayList<Individual>[] group = new ArrayList<Individual>()[4]

Ama derleme değil. Bunu nasıl yapabilirim?


8
Dizileri ve koleksiyonları karıştırmayın. Aslında, ilkellerle uğraşmadıkça (veya ne yaptığınızı bilmiyorsanız) dizileri kullanmayın. Diziler bir kullanılabilirlik kabusu, kodunuzu sürdürülemez kılıyor.
Sean Patrick Floyd

13
@SeanPatrickFloyd Dizilerin neden kullanılabilirlik kabusu olduğunu açıklayabilir misiniz?
kullanıcı

3
@crucifiedsoul emin. bir dizi büyüyemez, bir diziye hiçbir şey ekleyemezsiniz, bir dizi eşit hashcode veya toString gibi standart yöntemleri geçersiz kılmaz
Sean Patrick Floyd

9
@SeanPatrickFloyd tamam - peki tam olarak dört arrayliste ihtiyacım var - Her birine indeksle erişmeyi planlıyorum - Büyümek veya küçülmek için dış diziye ihtiyacım yok - Herhangi bir toString veya hashcode, vb. - bana göre, burada bir dizi bariz seçim - bu durumda alternatif olarak ne önerirsiniz?
BrainSlugs83

4
Tamam bu eski bir soru ama yine de soracağım ve cevap verip vermediğini göreceğim. Ben listelerin bir dizi ben karma zincirleri yapmaya öğreniyorum çünkü bu baktım vb korkunç bir fikir, kötü uygulama kodlama, neden bahsediyoruz herkesi görüyorum ve tanımı karma zincirinin listelerinin bir dizidir! Peki, merkezi bir programlama veri yapısı tam olarak nasıl korkunç kodlama uygulaması olabilir? Yoksa bu sadece @Sean tarafından belirtilen IYKWYD kategorisine mi giriyor?
jimboweb

Yanıtlar:


142

Gereğince Oracle Belgeleri :

"Parametreli türler dizileri oluşturamazsınız"

Bunun yerine şunları yapabilirsiniz:

ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);

Tom Hawting - tackline tarafından önerildiği gibi, yapmak daha da iyidir:

List<List<Individual>> group = new ArrayList<List<Individual>>(4);

20
List<List<Individual>> group = new ArrayList<List<Individual>>();muhtemelen daha iyi olurdu.
Tom Hawtin - taktik

4
"Genel tür dizisi yaratılamıyor" ne anlama geliyor? Bu benim için gerçekten bir anlam ifade etmiyor çünkü tutması gereken şeyi sağlarsanız jenerik değil, değil mi?
Andy

5
Soruyu cevaplamadığı için upvotes şaşırdım (yani bunu yapmak istiyorum, nasıl yapabilirim). Belki 1. cümle hariç.
Florian F

15
Liste referansı neden ArrayList'ten daha iyi?
shifu

3
@ shifu Liste referansı ArrayList'ten daha geneldir; List olarak bildirmek, ArrayList'in Liste API'sının ötesine uzanan API'sını soyutlar. Bu, API'sının ArrayList'in sahip olduğu ekstralar ile karıştırılmadan, API'sının Listenin neye ihtiyaç duyduğunun tamamını içeren List'e referansı basitleştirdiği için iyi olur. ArrayList olarak yalnızca referans yoluyla kullanılabilecek API'sından belirli bir şeye ihtiyacınız varsa bildirmeniz gerekir.
cellepo

98

Diğerlerinin de belirttiği gibi, ArrayList'i depolamak için başka bir liste kullanmak muhtemelen daha iyidir, ancak bir dizi kullanmanız gerekiyorsa:

ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

4
Kimse nedenini iyi açıklamıyor gibi görünüyor ve yukarıdaki pasajınızı seviyorum. neden bunun üzerinde liste kullanmanızı öneriyorsunuz?
clankill3r

3
Dizi grubu değişmezse, diziler Liste <> sınıflarından daha hızlı olduğu için bu yaklaşım daha iyidir.
Borzh

33
Soruyu cevapladığınız için teşekkürler. Bir listenin daha fazla bağlamı olmayan bir diziye otomatik olarak tercih edildiğini varsaymanın mantıklı bir nedeni yoktur.
Özel Sos

3
@Kelvincer Answer ( ArrayList<String>[] group = new ArrayList[4]) 'a tercih edilmesinin herhangi bir nedeni var mı? Oyuncular ekstra ekstra ne yapıyor?
cellepo

2
new ArrayList<?>[N]Ham tür kullanmaktan kaçınmak için kullanmalısınız.
Radiodef

80

Bu çalışıyor:

ArrayList<String>[] group = new ArrayList[4];

1
Bu, Dize (örneğin: ArrayList<String>yerine ArrayList<NotString>) dışında herhangi bir Nesnenin bir ArrayList'inin groupderlenmemesi
cellepo

12
Bu bir uyarı verir:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
matematik

24

ArrayList'i genişleten bir sınıf oluşturabilirsiniz

class IndividualList extends ArrayList<Individual> {

}

ve sonra diziyi

IndividualList[] group = new IndividualList[10];

17

Tamamen anlamıyorum, neden herkes özellikle bu soru için dizi üzerinde genel türü öneriyor.

İhtiyacım nfarklı arraylistleri endekslemekse ne olur ?

El ile nesneleri oluşturmak veya listeler veya başka bir şekilde oluşturmak için bir for döngüsü koymak List<List<Integer>>gerektiğini bildirerek , herhangi bir şekilde liste oluşturmak benim görevim olacaktır .n ArrayList<Integer>nn

Döküm olarak beyan etmek harika değil mi List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]? Bunu, tüm indeksleme nesnesini (arraylistler) tek başına oluşturmak zorunda olmadığı iyi bir tasarım olarak görüyorum.

Herkes neden bu (dizi formu) kötü bir tasarım olacağını aydınlatabilir ve dezavantajları nelerdir?


AFAICT, Java'nın masaya getirdiği korkunç yazım sisteminin neden olduğu bir tür kargo kült zihniyeti gibi görünüyor.
BrainSlugs83

@smsIce: Kötü bir tasarım değil. Sorun şu ki, birçok yazar soruyu tam olarak okumuyor ya da net bir şekilde anlamıyor.
testo

16

ArrayList Dizisi oluşturabilirsiniz

List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
    outer[i] = new ArrayList<>();
}

Bu, böyle senaryolarda yardımcı olacaktır. Dış olanın boyutunu biliyorsunuz. Ancak iç kısımların boyutu değişir. Burada, boyutu değişen Dizi listeleri içeren bir sabit uzunluk dizisi oluşturabilirsiniz. Umarım bu sizin için yararlı olacaktır.

In Java 8 ve üzeri sen çok daha iyi bir şekilde yapabilirsiniz.

List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());

Yöntem referansı kullanarak daha da iyi

List<Integer>[] outer = new List[10];
Arrays.setAll(outer,  ArrayList :: new);

2
Bunu kullandığınızda, geçerli dizine sahip yapıcıyı ArrayList (1), ArrayList (2), ArrayList (3) vb. Argüman olarak ArrayList::newçağıracaktır ArrayList(int). Böylece, büyük veya küçük boyutlu dizilerle sonuçlanacaksınız, kullanımınıza bağlı olarak. Bunu kullanmaktan vazgeçiyorum ve bunun yerine lambda ifadenizde yapıcıyı kendiniz çağırdığınız ikinci yaklaşımı tercih ederim.
Genhis

8

Bu ArrayList dizisi çalışır. Nasıl çalıştığını anlamaya çalışın.

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]);
    }
}

Bazı kodlar için Kelvincer'e verilen krediler.


6

Bu durumdaki sorun, bir arraylist kullanarak, belirli bir konuma eklemek için o (n) 'nin zaman karmaşıklığına sahip olmanızdır. Bir dizi kullanırsanız, dizinizi bildirerek bir bellek konumu oluşturursunuz.


Belirli bir konuma ekleme hem dizi hem de ArrayList için O (n) 'dir. Doldurma aynı zamanda hem diziler hem de ArrayList için O (n) 'dir.
Navin

2
Diziler için belirli bir konuma ekleme O (1) 'dir. ArrayList için O (n), ancak diziler için O (1).
14'te aviemet

3

Genel tür dizisi oluşturamazsınız. ArrayLists Listesi Oluştur:

 List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();

veya GERÇEKTEN dizi gerekiyorsa (UYARI: kötü tasarım!):

 ArrayList[] group = new ArrayList[4];

2
  1. Oluşturma ve başlatma

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. Yazma erişimi

    yourArray[i]= someArrayList;

    dahili ArrayList öğelerine erişmek için:

    ((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
  3. Okuma erişimi

    dizi öğesini i bir ArrayList kullanım türü döküm olarak okumak için:

    someElement= (ArrayList<YourType>) yourArray[i];

    dizi elemanı için i: j dizinindeki ArrayList öğesini okumak için

    arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);

2

List [] listArr = yeni ArrayList [4];

Çizginin üstünde uyarı verir, ancak çalışır (yani Array of ArrayList oluşturur)


1

Sprite konumları için bir dizi ArrayLists'i statik olarak Puan olarak bildirmek için:

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

dinamik:

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

Buradaki uyarılara ve bazı karmaşık önerilere rağmen, aynı türden ilgili ArrayLists'i temsil etmek için zarif bir çözüm olarak bir dizi ArrayLists buldum.


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

1

Böyle yaratabilirsiniz ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

Jenerik olmayan tipte bir dizi oluşturmanız ve daha sonra jenerik olana dönüştürmeniz gerekir.


1

ArrayList<Integer>[] graph = new ArrayList[numCourses] İşe yarıyor.


0

Bunu daha kolay kullanıyorum ...

static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
 group=new ArrayList[size];
 for(int i=0;i<size;i++)
 {
  group[i]=new ArrayList<Individual>();
 }

0

Bunu yapabilirsiniz :

// ArrayList türünde bir Array oluşturma

`ArrayList<Integer>[] a = new ArrayList[n];`

// Dizideki her öğe için bir ArrayList yapın

for(int i=0; i<n; i++){ 
    a[i] = new ArrayList<Integer>();
}

0
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
   al[i] = new ArrayList<String>();
}

-1

bir Liste [] oluşturabilir ve bunları for döngüsü ile başlatabilirsiniz. hatasız derler:

List<e>[] l;
for(int i = 0; i < l.length; i++){
    l[i] = new ArrayList<e>();
}

arrayList [] l ile de çalışır.


2
l.lengthfor-döngüsünde tanımsız. Bu bir çalışma zamanı hatası olabilir.
bourbaki4481472

l bir uzunluğa sahip olacak şekilde başlatılmamış, for döngüsüne ulaştığında hala bir boş gösterici. yani Liste <e> [] l = yeni Liste [UZUNLUK];
Erik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.