web-dev-qa-db-ja.com

Javaの可変長(動的)配列

私は、プログラムの実行中にサイズと値が変化するように整数配列を初期化する方法を疑問に思っていましたか?

104

はい: ArrayList を使用します。

Javaでは、「通常の」配列は固定サイズです。あなたは彼らにサイズを与えなければならず、それらを拡大したり縮小したりすることはできません。サイズを変更するには、新しい配列を作成して必要なデータをコピーする必要がありますが、これは非効率的で苦痛です。

幸いなことに、共通のデータ構造を実装するすべての種類の組み込みクラス、およびその他の便利なツールもあります。完全なリストについては、 Java 6 API を確認してください。

1つの注意点:ArrayListは、オブジェクト(整数など)のみを保持でき、プリミティブ(整数など)は保持できません。 MOSTの場合、 autoboxing/autounboxing はこれを静かに処理しますが、実行内容によっては奇妙な動作をする可能性があります。

115
Pops

Javaの配列は固定サイズです。必要なのは、Javaで利用できる非常に貴重なコレクションの1つであるArrayListです。

の代わりに

Integer[] ints = new Integer[x]

あなたが使う

List<Integer> ints = new ArrayList<Integer>();

次に、リストを変更するには、適切なJavadocにある他の多くの便利なメソッドの中でints.add(y)およびints.remove(z)を使用します。

Javaで利用可能なCollectionsクラスは非常に強力であり、Java初心者が不必要に自分自身を書き直そうとする傾向がある多くの組み込み機能を提供するため、これらのクラスを学ぶことを強くお勧めします。

33
MattGrommes

配列は、インスタンス化されると固定サイズになります。代わりにリストを使用できます。

AutoboxingはListを配列と同様に使用可能にし、単純にint-valuesを入れることができます:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
22
Mnementh
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

ソース: 動的配列の作成方法

10
Anuj Dhiman

ArrayListnot動的配列であり、配列に連動するリストであるため、ArrayListを提案する以前の回答に同意しません。違いは、次のことを実行できないことです。

ArrayList list = new ArrayList(4);
list.put(3,"Test");

バッキング配列でこのような追加が許可されていても、この位置にまだ要素がないため、IndexOutOfBoundsExceptionが発生します。したがって、@ randy-lanceが提案するようなカスタムの拡張可能な配列実装を使用する必要があります

10
cspann
  1. リストを使用して小規模のサイズを処理することをお勧めします。

  2. 膨大な数の番号がある場合、NEVERリストとオートボクシングを使用します。

    List <Integer>リスト

すべての単一の整数に対して、新しい整数が自動的に作成されます。リストのサイズが大きくなると、遅くなります。これらの整数は不要なオブジェクトです。この場合、推定サイズを使用する方が良いでしょう、

int[] array = new int[ESTIMATED_SIZE];
7
Hao Deng

配列のサイズを変更することはできません。ただし、適切なサイズの新しいアレイを作成し、古いアレイから新しいアレイにデータをコピーできます。

しかし、最良のオプションは、ジャカルタコモンズのIntListを使用することです。 ( ここ

Listと同じように機能しますが、intよりもラッパーオブジェクトを保存する代わりにintを保存するため、スペースが少なく、効率的です(これがIntegerクラスです)。

4
Thiago Chaves

代わりにListを使用してはどうですか?たとえば、ArrayList<integer>

4
Konrad Garus