2016-10-27 7 views
0

私はFloatListsの配列を宣言することができる場合:ArrayList<FloatList> [][] values = new ArrayList<FloatList>() [3][3];FloatList [][] values = new FloatList[3][3];Java/P5:FloatListsを保持するArraylistsの配列を宣言するには?

なぜそれがこのようなFloatListsを保持しているのArrayListの配列を宣言するために動作しませんか?またはそれ以上:ArrayList<FloatList> [][] values = new ArrayList<FloatList> [3][3]();

これはどのように達成できますか?その厚いテクスチャーの下に深く埋め込まれたfloatsを参照するのは難しいでしょうか?

+2

'ArrayList [] [] values = new ArrayList [3] [3];'しかし概念的には、これはあまりにも複雑になり始めます。 – Compass

+0

私は2D行列を持ち、各四角形内には未知の量のカテゴリがあります。カテゴリ内で一連の値が保持されます。行列が完成すると、各カテゴリの中央値が見つけられて表示されます。 – jackoverflow

+0

多めのテキストで更新しました。基本的に、あなたは何かの配列をインスタンス化しています。 – Compass

答えて

1
ArrayList<FloatList> [][] values = new ArrayList[3][3]; 

基本的に、あなたはArrayList Sの3次元配列であるオブジェクトをしたいと宣言し、実際のArrayListオブジェクトを生成していません。

はその後、あなたはそれらのそれぞれのインスタンスを作成する必要があるので、例えば:

values[0][0] = new ArrayList<>(); 

のように。

2

最も内側のタイプから最も外側のタイプまで作業します。あなたはFloatListで始まる:

FloatList 

次にArrayListでいることをラップ:

ArrayList<FloatList>[] 

または2D配列:

ArrayList<FloatList>[][] 

ArrayList<FloatList> 

その後、あなたはそれの配列をしたいです

これは宣言の型を与えますが、変数に値を与えて初期化する必要があります。それにサイズを与えることによって、アレイを起動します。

ArrayList<FloatList>[] array = new ArrayList[10]; 

これは、あなたArrayList<FloatList>オブジェクトの配列を与えるが、彼らはnullとして開始します。アレイ内のすべてのインデックスをループしたい、彼らにあなたの価値を与えるとArrayList<FloatList>のインスタンスにインデックスの値を設定するnewキーワードを使用するには、次の2次元配列の場合

for(int i = 0; i < array.length; i++){ 
    array[i] = new ArrayList<FloatList>(); 
} 

、あなたが使用したいです同じ論理、ちょうどネストされたforループ内にあります。のインデックスでArrayListFloatListfloatを追加するために、最後に

array[i].add(new FloatList()); 

次に、配列の特定のインデックスでArrayListFloatListを追加するために、あなたはこれを行うだろう配列、あなたがこれを行うだろう:

array[x].get(y).append(0.5); 

そして、配列のインデックスでArrayListFloatListのインデックスのうちfloatを取得するには、あなたがこれを行うと思います。一緒にすべてを置く

float f = array[x].get(y).get(z); 

が、それは次のようになります。

ArrayList<FloatList>[] array = new ArrayList[10]; 

for(int i = 0; i < array.length; i++){ 
    array[i] = new ArrayList<FloatList>(); 
} 

array[1].add(new FloatList()); 

array[1].get(0).append(0.25); 
array[1].get(0).append(0.5); 
array[1].get(0).append(0.75); 

float f = array[1].get(0).get(2); 

println(f); 
+0

'ArrayList [] array = new ArrayList [10];'このコードは未チェック警告を生成します。 'SuppressWarning(" unchecked ")' – seal

+0

@sealなしでこれを削除する方法はありますか?これは処理の質問であり、Processingはこのコードの警告を生成しないことに注意してください。 –

0

それが原因でJVMがジェネリックを提供する方法のために動作しません。 JavaのGenericsは、実行時に生の型の使用とキャストになるフロントエンドのコンパイラ機能です。

ジェネリックを使用するとコンパイラは何をしていますか?

これは非常に工夫した例です。のは、私は、後にそうように、との新しいプロセスをキックオフするために使用するコマンドライン引数を格納するList<String>を作成したいとしましょう:

List<String> cmd = new ArrayList<>(); 
cmd.add("java"); 
cmd.add("-jar"); 
cmd.add("path/to/my.jar"); 
... 
String args = cmd.get(0)+" "+cmd.get(1)+" "+cmd.get(2); 

コンパイル時に、コンパイラは私がいることを確認するためにチェックしますcmd経由で汎用Listメソッドを使用するたびにStringタイプを使用し、互換性のないタイプのインスタンスを使用しようとするとエラーが発生します。しかし、実行前にコンパイル中に発生する、消し器と呼ばれる小さなものがあります。効果的に、ボンネットの下に、コンパイラはこのようなものの中に上記のコードを変換します

List cmd = new ArrayList(); 
cmd.add("java"); 
cmd.add("-jar"); 
cmd.add("path/to/my.jar"); 
... 
String args = (String)cmd.get(0)+" "+(String)cmd.get(1)+" "+(String)cmd.get(2); 

、なぜ私の一般的な配列のコードはコンパイルされませんか?あなたの例では

、あなたがそうのように、ジェネリック型の配列を作成したい:問題は、型消去の、ある

ArrayList<FloatList>[][] array = new ArrayList<FloatList>[n][m]; //Doesn't compile? What gives? 

ArrayList<FloatList>クラス型が実際に存在していない、と今では、存在しないタイプの2次元配列を作成するようにJVMに依頼しました。

これで代替手段はありますか?

は、うーん...それはかなりありませんが、このような何かを行うことができます:この周り

class ArrayListOfFloatList extends ArrayList<FloatList>{ 
    ... 
} 

//Somewhere else in your code: 
ArrayListOfFloatList[][] myArray = new ArrayListOfFloatList[n][m]; 
//This will compile because ArrayListOfFloatList is a real class. 

唯一の他の方法は、配列を使用しないことであろう。醜いですが、残念ながらJavaが現在どのように実装されているかの限界です。

+0

これは正しいとは思わない。あなたが言っているコードはコンパイルされず、ちゃんとコンパイルされます。 –

+0

'LinkedList'は' ArrayList'のサブクラスではないので、編集したコードはコンパイルされません。ジェネリックではありません。あなたは絶対に配列を使ってジェネリックを扱うために汎用サブクラスを使わなくてはなりません**。 –

+0

公正なポイント。私はまだ 'ArrayList'を拡張することは非常に合理的な解決策ではないと思っています(特にProcessingコンテキストで)。しかし、downvoteは引っ込められます。 –

関連する問題