Java で配列のサイズを変更する方法を検索しましたが、現在の要素を保持したまま配列のサイズを変更する方法が見つかりませんでした。
たとえば、のようなコードを見つけましたint[] newImage = new int[newWidth];
が、これにより以前に保存された要素が削除されます。
私のコードは基本的にこれを行います: 新しい要素が追加されるたびに、配列は1ずつ大きくなります。これは動的プログラミングで実行できると思いますが、実装方法がわかりません。
Java では配列のサイズを変更できません。次のいずれかを行う必要があります。
目的のサイズの新しい配列を作成し、元の配列の内容を新しい配列にコピーします。java.lang.System.arraycopy(...);
java.util.ArrayList<T>
配列を大きくする必要がある場合は、クラスを使用してください。質問で説明した内容をうまくカプセル化しています。
java.util.Arrays.copyOf(...)
元の配列の内容で、より大きな配列を返すメソッドを使用します。
良くありませんが、動作します:
int[] a = {1, 2, 3};
// make a one bigger
a = Arrays.copyOf(a, a.length + 1);
for (int i : a)
System.out.println(i);
前に述べたように、ArrayListを使用します
これを行うにはいくつかの方法があります。
方法 1: System.arraycopy()
:
指定されたソース配列の配列を、指定された位置からコピー先配列の指定された位置にコピーします。配列コンポーネントのサブシーケンスは、src によって参照されるソース配列から、dest によって参照される宛先配列にコピーされます。コピーされるコンポーネントの数は、長さの引数と同じです。ソース配列の srcPos から srcPos+length-1 までの位置にあるコンポーネントは、宛先配列の destPos から destPos+length-1 までの位置にそれぞれコピーされます。
Object[] originalArray = new Object[5];
Object[] largerArray = new Object[10];
System.arraycopy(originalArray, 0, largerArray, 0, originalArray.length);
方法 2: Arrays.copyOf()
:
コピーが指定された長さになるように、指定された配列をコピーし、(必要に応じて) 切り捨てるか null でパディングします。元の配列とコピーの両方で有効なすべてのインデックスについて、2 つの配列には同じ値が含まれます。コピーでは有効であるがオリジナルでは無効なインデックスの場合、コピーには null が含まれます。このようなインデックスは、指定された長さが元の配列の長さよりも大きい場合にのみ存在します。結果の配列は、元の配列とまったく同じクラスです。
Object[] originalArray = new Object[5];
Object[] largerArray = Arrays.copyOf(originalArray, 10);
このメソッドは通常System.arraycopy()
、舞台裏で使用されることに注意してください。
方法 3: ArrayList
:
List インターフェイスのサイズ変更可能な配列の実装。オプションのリスト操作をすべて実装し、null を含むすべての要素を許可します。List インターフェイスの実装に加えて、このクラスは、リストを格納するために内部で使用される配列のサイズを操作するメソッドを提供します。(このクラスは、非同期であることを除いて、Vector とほぼ同等です。)
ArrayList は配列と同様に機能しますが、格納できる以上の要素を追加すると自動的に拡張されます。これは array によってサポートされ、Arrays.copyOfを使用します。
ArrayList<Object> list = new ArrayList<>();
// This will add the element, resizing the ArrayList if necessary.
list.add(new Object());
あなたはあなたArrayList
のために仕事をするものを使うことができます。
配列サイズを変更することはできません。 ただし、より大きなサイズの配列を作成することで、ある配列の要素を別の配列にコピーできます。
配列がいっぱいの場合は 2 倍のサイズの配列を作成し、配列が 1/2 いっぱいの場合は配列を半分に縮小することをお勧めします
public class ResizingArrayStack1 {
private String[] s;
private int size = 0;
private int index = 0;
public void ResizingArrayStack1(int size) {
this.size = size;
s = new String[size];
}
public void push(String element) {
if (index == s.length) {
resize(2 * s.length);
}
s[index] = element;
index++;
}
private void resize(int capacity) {
String[] copy = new String[capacity];
for (int i = 0; i < s.length; i++) {
copy[i] = s[i];
s = copy;
}
}
public static void main(String[] args) {
ResizingArrayStack1 rs = new ResizingArrayStack1();
rs.push("a");
rs.push("b");
rs.push("c");
rs.push("d");
}
}
配列の代わりに ArrayList を使用できます。n個の要素を追加できるように
List<Integer> myVar = new ArrayList<Integer>();
標準クラス java.util.ArrayList はサイズ変更可能な配列で、新しい要素が追加されると大きくなります。
配列のサイズを変更することはできません。ただし、元の配列を新しいサイズの配列にコピーして現在の要素を保持することで、配列のサイズを変更することは可能です。要素を削除してサイズを変更することで、配列のサイズを縮小することもできます。
import java.util.Arrays
public class ResizingArray {
public static void main(String[] args) {
String[] stringArray = new String[2] //A string array with 2 strings
stringArray[0] = "string1";
stringArray[1] = "string2";
// increase size and add string to array by copying to a temporary array
String[] tempStringArray = Arrays.copyOf(stringArray, stringArray.length + 1);
// Add in the new string
tempStringArray[2] = "string3";
// Copy temp array to original array
stringArray = tempStringArray;
// decrease size by removing certain string from array (string1 for example)
for(int i = 0; i < stringArray.length; i++) {
if(stringArray[i] == string1) {
stringArray[i] = stringArray[stringArray.length - 1];
// This replaces the string to be removed with the last string in the array
// When the array is resized by -1, The last string is removed
// Which is why we copied the last string to the position of the string we wanted to remove
String[] tempStringArray2 = Arrays.copyOf(arrayString, arrayString.length - 1);
// Set the original array to the new array
stringArray = tempStringArray2;
}
}
}
}