2012-04-21 17 views
13

私は簡単な質問があります。私は、クラス内で変化する長さが必要なJavaの整数配列を持っています。具体的には、特定の状況で1つ増やす必要があります。私はこれを試した。配列の長さを増やす方法

 sbgHeadX = new int[ numberOfSBG ]; 

私が必要としたときに整数変数numberOfSBGを増やすことになりましたが、これはうまくいかないと思います。他の方法はありますか?

+0

妥当な最大値を指定できますか。明らかにあなたの配列はInteger.MAX_VALUEよりも大きくなることはありませんが、あなたの配列が300よりも大きくならないことが分かっていれば、その長さを300に設定することもできます。 – emory

+0

@emory - 個人的には、 code smell:結果は配列であり、その要素のうちのいくつかは「使用されるべきではない」ものです。これは、エラーが発生しやすく、不器用なコーディングスタイルであり、有効な要素の数で別の変数を渡す必要があります。また、 '.size()'が扱う要素の数をもたらすという前提を打破します。 – ToolmakerSteve

答えて

13

を使用します。作成されると、配列サイズを変更することはできません。

配列は、単一の型の固定数の値を保持するコンテナオブジェクトです。配列の長さは、配列の作成時に設定されます。作成後、その長さは固定されます。

Source

+0

arraylistの特定のインデックスにはどうすればアクセスできますか? – kullalok

+1

@ user1276078 'yourArraylist.get(2)'は 'yourClassicArray [2]'と同等です – talnicolas

+1

これは動作しますが、OPがプリミティブintであることを示すので、不要なオートボクシングが発生する可能性があります。 JavaコレクションではObjectが必要です。そのため、JVMは、コレクションメソッドが呼び出されるたびにすべての値をIntegerに変換します。これは時間が経つにつれて高価になる可能性があります。明らかに、プログラマーは、Hunter McMillenのようなことをすることの「オーバーヘッド」に値するかどうかを判断する必要がありますが、彼の答えはIMHOです。質問に対するより正確な答えです。 –

1

定義では、配列は固定サイズです。その代わりに「動的サイズ」の配列であるArraylistを使うことができます。実際に何が起こるかは、VMがArrayListによって公開される配列のサイズを調整することです。

See also

*

は、私はあなたはもう長さを心配する必要はありませんようご ArrayListを使用することをお勧めバックコピーアレイ

+3

*「実際に何が起こるかは、VMがarraylistによって公開されているアレイのサイズを調整することです。間違っています。実際、 'ArrayList'のコードは新しいバッキング配列を作成し、既存のバッキング配列の内容をコピーします。配列の長さは、JVMでも変更することはできません。これはJava言語仕様に違反します。 –

+1

@StephenCあなたはそうです。説明するときのミスフォールト。 –

+0

あなたはまだ半分の権利しかありません。調整を行っているのはJVMではありません。 'ArrayList'クラスは通常のJavaコードでそれを行います。配列は配列リストによって公開されません...配列リストによって隠されたプライベートオブジェクトです。 –

18

あなたが望んでいないかのArrayListを使用できない場合は、その後、ユーティリティメソッドがあります:維持しながら、新しいサイズを指定することができます

Arrays.copyOf() 

要素。

+2

"このアルゴリズムは、他のクイックソートを二次的な性能に劣化させる多くのデータセットでn * log(n)の性能を提供します。 –

21

Javaの配列は、宣言時に指定された固定サイズです。配列のサイズを大きくするには、より大きなサイズの新しい配列を作成し、すべての古い値を新しい配列にコピーする必要があります。

例:

char[] copyFrom = { 'a', 'b', 'c', 'd', 'e' }; 
char[] copyTo = new char[7]; 

System.out.println(Arrays.toString(copyFrom)); 
System.arraycopy(copyFrom, 0, copyTo, 0, copyFrom.length); 
System.out.println(Arrays.toString(copyTo)); 

代わりにあなたがリストのような動的なデータ構造を使用することができます。

+2

IMHOは、 'Arrays.copyOf()'を使って、Jakubの答えのように、より短い、より読みやすいコードを提供します。 – ToolmakerSteve

0
Item[] newItemList = new Item[itemList.length+1]; 
    //for loop to go thorough the list one by one 
    for(int i=0; i< itemList.length;i++){ 
     //value is stored here in the new list from the old one 
     newItemList[i]=itemList[i]; 
    } 
    //all the values of the itemLists are stored in a bigger array named newItemList 
    itemList=newItemList; 
0

ArrayListを使用できます。配列のサイズは固定です。

ここにはExampleがお手伝いします。この例は出力が非常に簡単です。

 
Output: 
2 5 1 23 14 
New length: 20
Element at Index 5:29
List size: 6
Removing element at index 2: 1
2 5 23 14 29
関連する問題