配列リストの配列を作成する


175

以下のようなarraylistの配列を作成したいと思います。

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

しかし、それはコンパイルされていません。これどうやってするの?


8
配列とコレクションを混在させないでください。実際、プリミティブを扱っているのでなければ(または何をしているのかわかっているのでなければ)配列を使用しないでください。配列はユーザ​​ビリティの悪夢であり、コードを保守しにくくします。
Sean Patrick Floyd

13
@SeanPatrickFloyd配列がユーザビリティの悪夢である理由を説明できますか?
ユーザーは

3
@crucifiedsoul確かに。配列は、配列等等号ハッシュコードまたはのtoStringなどの標準的な方法上書きされることはありません、あなたは配列に何を挿入することはできません、成長することはできません
ショーン・パトリック・フロイドの

9
@SeanPatrickFloydわかりました-ええと、ちょうど4つのarraylistが必要です-それぞれをインデックスでアクセスする予定です-外部の配列を拡大または縮小する必要はありません-toStringやハッシュコードなどは必要ありません。 -私にとって、ここではアレイが明白な選択です-この状況で代替として何をお勧めしますか?
BrainSlugs83 2015年

4
さて、これは古い質問ですが、とにかく質問して、誰かが答えるかどうかを確認します。なぜリストの配列がひどい考えなのか、コーディングの習慣が悪いなど、皆が話しているのを見ています。ハッシュチェーンを学んでいるので、これを調べました。ハッシュチェーンの定義はリストの配列です。では、中央のプログラミングデータ構造はどのようにしてひどいコーディングの習慣になるのでしょうか。または、これは@Seanによって言及されたIYKWYDカテゴリに該当しますか?
jimboweb 2016年

回答:


142

Oracleのドキュメントに従って:

「パラメーター化された型の配列は作成できません」

代わりに、次のことができます。

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

トム・ホーティングが提案したように-タックライン、それを行うことはさらに良いです:

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

20
List<List<Individual>> group = new ArrayList<List<Individual>>();おそらくより良いでしょう。
トム・ホーティン-タックライン

4
「ジェネリック型の配列を作成できない」とはどういう意味ですか?それは私が理解することを本当に意味しません。なぜなら、あなたが保持することを想定しているものを提供する場合、それはジェネリックではないからですよね?
アンディ

5
それが質問に答えないので、私は賛成投票に驚いています(つまり、私はこれをしたいのですが、どうすればそれを行うことができますか)。多分最初の文を除いて。
Florian F

15
List参照がArrayListよりも優れているのはなぜですか?
Shifu、2015

3
@shifuリスト参照はArrayListよりも一般的です。Listとして宣言すると、List APIを超えて拡張するArrayListのAPIが抽象化されます。これは、リストの参照を単純化するのに適しています。そのAPIはおそらく、リストに必要なもののすべてを備えているため、ArrayListのエクストラで参照のAPIを混乱させることはありません。参照を介して使用できるようにAPIから特定のものが必要な場合にのみ、ArrayListとして宣言する必要があります。
cellepo 2016年

98

他の人が述べたように、別のリストを使用してArrayListを格納する方がおそらく良いでしょうが、配列を使用する必要がある場合:

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

4
誰も理由をうまく説明していないようで、上記のスニペットが好きです。なぜこれよりもリストを使用することを勧めますか?
clankill3r 2013年

3
配列グループが変更されない場合は、配列がList <>クラスよりも高速であるため、このアプローチの方が適しています。
Borzh

33
実際に質問にお答えいただきありがとうございます。追加のコンテキストなしで、配列よりもリストの方が好ましいと自動的に推測する論理的な理由はありません。
スペシャルソース

3
@kelvincer Answer(ArrayList<String>[] group = new ArrayList[4])よりも望ましい理由は何ですか?キャストは何をすればよいでしょうか?
cellepo 2016年

2
new ArrayList<?>[N]rawタイプの使用を避けるために使用する必要があります。
Radiodef

80

これは機能します:

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

1
これには、String以外のオブジェクトのArrayList(つまり:ArrayList<String>ではなくArrayList<NotString>)を追加しgroupてもコンパイルされないという望ましい利点があります
cellepo

12
これは警告を生成します:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
数学

24

ArrayListを拡張するクラスを作成できます

class IndividualList extends ArrayList<Individual> {

}

配列を作成します

IndividualList[] group = new IndividualList[10];

17

私はそれを完全に理解していません。なぜこの質問のために、誰もが配列に対してジェネリック型を提案しているのはなぜですか。

必要に応じて、nさまざまな配列リストにインデックスを付けます。

宣言List<List<Integer>>すると、n ArrayList<Integer>手動でオブジェクトを作成するか、nリストを作成するためのforループを配置するか、その他の方法で、リストを作成することが常に私の義務になりnます。

としてキャストして宣言すると、すばらしいと思いませんかList<Integer>[] = (List<Integer>[]) new List<?>[somenumber]。自分ですべてのインデックスオブジェクト(配列リスト)を作成する必要がない、優れたデザインだと思います

なぜこれ(アレイフォーム)が悪いデザインになるのか、そしてその欠点は何ですか?


AFAICTそれは、Javaがもたらした恐ろしいタイピングシステムによって引き起こされる一種の貨物文化の精神性のようです。
BrainSlugs83 2015年

@smsIce:それは悪いデザインではありません。問題は、多くの作家が質問全体を読んだり、それを明確に理解していないことです。
testo

16

ArrayListの配列を作成できます

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

これは、このようなシナリオで役立ちます。あなたはアウターのサイズを知っています。しかし、内側のもののサイズは異なります。ここでは、サイズが変化する配列リストを含む固定長の配列を作成できます。これがあなたに役立つことを願っています。

Java 8の上方に、あなたはより良い方法でそれを行うことができます。

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

メソッドリファレンスを使用するとさらに良い

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

2
を使用すると、現在のインデックスを引数として配列ArrayList::newを呼び出しますArrayList(int)-ArrayList(1)、ArrayList(2)、ArrayList(3)など。したがって、サイズが小さすぎるか、大きすぎる配列になります。用途に応じて。私はそれ使用しないようにします。代わりに、ラムダ式でコンストラクタを自分で呼び出す2番目のアプローチを優先します。
Genhis

8

これは機能し、ArrayListの配列です。それがどのように機能するかを理解するためにそれを試してください。

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

一部のコードのKelvincerへのクレジット。


6

この状況の問題は、arraylistを使用することにより、特定の位置に追加するためにo(n)の時間の複雑さを取得することです。配列を使用する場合は、配列を宣言することによってメモリ位置を作成するため、定数です。


特定の位置に追加すると、配列とArrayListの両方でO(n)になります。配列とArrayListの両方について、塗りつぶしもO(n)です。
ナビーン

2
配列の場合、特定の位置に追加するとO(1)になります。ArrayListの場合はO(n)ですが、配列の場合はO(1)です。
アビメット2014年

3

ジェネリック型の配列は作成できません。ArrayListのリストを作成します。

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

または本当に配列が必要な場合(警告:設計が悪い!):

 ArrayList[] group = new ArrayList[4];

2
  1. 作成と初期化

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. 書き込みアクセス

    yourArray[i]= someArrayList;

    内部ArrayListの要素にアクセスするには:

    ((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
  3. 読み取りアクセス

    配列要素iをArrayListとして読み取るには、型キャストを使用します。

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

    配列要素iの場合:インデックスjのArrayList要素を読み取る

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

2

List [] listArr = new ArrayList [4];

上記の行は警告を出しますが、機能します(つまり、ArrayListの配列を作成します)


1

たとえばスプライトの位置をArrayListの配列として静的に宣言するには、次のようにします。

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

動的に:

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

ここでの注意といくつかの複雑な提案にもかかわらず、ArrayListの配列は、同じタイプの関連するArrayListを表すための洗練されたソリューションであることがわかりました。



1

このように作成できます ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

非ジェネリック型の配列を作成してから、ジェネリック型にキャストする必要があります。



0

これは使いやすいと思います...

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

あなたはこれを行うことができます :

//タイプArrayListの配列を作成します

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

//配列の要素ごとにArrayListを作成します

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

List []を作成し、forループで初期化できます。エラーなしでコンパイルされます:

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

arrayList [] lでも機能します。


2
l.lengthforループでは未定義です。これは実行時エラーの可能性があります。
bourbaki4481472 2015年

lは長さを持つように初期化されていません。forループに到達しても、nullポインターのままです。つまり、List <e> [] l = new List [LENGTH];
エリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.