web-dev-qa-db-ja.com

配列の最後に要素を追加する方法は?

配列の最後に新しい要素を追加または追加する方法を知りたい。最後に要素を追加する簡単な方法はありますか? StringBufferの使用方法は知っていますが、それを使用して配列に要素を追加する方法はわかりません。 ArrayListまたはリストなしの方が好きです。 StringBufferは整数で動作するのだろうか。

8
Jeffrey Zong

Javaの配列は固定長であるため、要素を配列に追加することはできません。ただし、 Arrays.copyOf(array, size) を使用して既存の配列から新しい配列を作成できます。

public static void main(String[] args) {
    int[] array = new int[] {1, 2, 3};
    System.out.println(Arrays.toString(array));
    array = Arrays.copyOf(array, array.length + 1); //create new array from old array and allocate one more element
    array[array.length - 1] = 4;
    System.out.println(Arrays.toString(array));
}

配列の使用をやめて、 List を使用することをお勧めします。

8
Tunaki

Javaの配列は、変更できない固定長です。したがって、Javaは、可変長のリストを維持できるクラスを提供します。

通常、List<T>インターフェイスがあり、これはクラスTのインスタンスのリストを表します。最も簡単で最も広く使用されている実装は、ArrayListです。以下に例を示します。

List<String> words = new ArrayList<String>();
words.add("Hello");
words.add("World");
words.add("!");

List.add()は単純にリストに要素を追加し、List.size()を使用してリストのサイズを取得できます。

3

OPは、不明な理由で、「arraylistまたはlistのないほうがいい」と言っています。

参照している型がプリミティブである場合(整数については言及しますが、intまたはIntegerを意味するかどうかは言わない)、次のようなNIOバッファークラスのいずれかを使用できます。 _Java.nio.IntBuffer_ 。これらはStringBufferと同じように機能します-プリミティブ型のリストのバッファーとして機能し(バッファーはすべてのプリミティブに存在しますが、オブジェクトには存在しません)、バッファーを配列にラップしたり抽出したりできますバッファからの配列。

Javadocsが「バッファの容量は決して負ではなく、決して変化しない」と言うことに注意してください。まだ配列のラッパーにすぎませんが、より使いやすいものです。バッファを効果的に拡張する唯一の方法は、allocate()より大きいバッファを使用し、put()を使用して古いバッファを新しいバッファにダンプすることです。

プリミティブでない場合は、おそらくListを使用するか、不可能または不可能な理由を考え出す必要があります。

1
dcsohl

リストの最後に新しい要素を追加しようとしている場合、他の多くの人が指摘しているように、array [array.length-1] = x;する必要があります。しかし、これは既存の要素を置き換えます。

配列への連続的な追加のようなもの。インデックスを追跡し、最後まで要素を追加し続け、追加を行う関数が次のインデックスを返すようにすることができます。これにより、さらに多くの要素を配列に収めることができます。

もちろん、どちらの場合でも、配列のサイズは事前定義されます。 arraylistが必要ないため、Vectorが他のオプションになる可能性があります。これにより、同じ機能をすべて使用でき、さらにサイズの増加も処理できます。

StringBufferを配列する部分に来ます。あなたが探しているのはgetChars(int srcBegin、int srcEnd、char [] dst、int dstBegin)メソッドだと思います。あなたの疑問を解決するかもしれないそれを調べてください。繰り返しになりますが、配列を取得した後でも、最後の既存の要素(この場合は文字)のみを置き換えることができます。

1
happyHelper

用語を明確にするために:配列は固定長の構造であり(既存の長さは変更できない)、式末尾に追加は(それ自体では)意味がありません。

できることは、1要素大きい新しい配列を作成し、最後のスロットの新しい要素を埋めることです。

public static int[] append(int[] array, int value) {
     int[] result = Arrays.copyOf(array, array.length + 1);
     result[result.length - 1] = value;
     return result;
}

Appendが呼び出されるたびに新しい配列が作成され、古い配列の内容がコピーされるため、これはすぐに非効率になります。

オーバーヘッドを大幅に削減する1つの方法は、より大きな配列を作成し、実際にどのインデックスが満たされるかを追跡することです。要素を追加すると、次のインデックスを埋めてインデックスをインクリメントするのと同じくらい簡単になります。アレイが完全にいっぱいになると、より多くの空き領域を持つ新しいアレイが作成されます。

そして、ArrayListが何をするかを推測してください。まさにそれです。したがって、動的なサイズの配列が必要な場合は、ArrayListが適しています。車輪を再発明しないでください。

0
Durandal