位置と値を指定する要素を配列に追加する必要があります。たとえば、私は配列を持っています
int []a = {1, 2, 3, 4, 5, 6};
適用後addPos(int 4, int 87)
は
int []a = {1, 2, 3, 4, 87, 5};
ここで配列のインデックスをシフトする必要があることは理解していますが、コードでそれを実装する方法がわかりません。
これでうまくいくはずです:
public static int[] addPos(int[] a, int pos, int num) {
int[] result = new int[a.length];
for(int i = 0; i < pos; i++)
result[i] = a[i];
result[pos] = num;
for(int i = pos + 1; i < a.length; i++)
result[i] = a[i - 1];
return result;
}
ここa
で、は元の配列、pos
は挿入の位置、は挿入num
される番号です。
これを行う最も簡単な方法は、と メソッドArrayList<Integer>
を使用するadd(int, T)
ことです。
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
// Now, we will insert the number
list.add(4, 87);
Jrad のソリューションは優れていますが、彼が配列のコピーを使用していないことが気に入りません。内部的に System.arraycopy() はネイティブ呼び出しを行うため、より高速な結果が得られます。
public static int[] addPos(int[] a, int index, int num) {
int[] result = new int[a.length];
System.arraycopy(a, 0, result, 0, index);
System.arraycopy(a, index, result, index + 1, a.length - index - 1);
result[index] = num;
return result;
}
新しい配列を作成し、それを使用System.arraycopy
してプレフィックスとサフィックスをコピーし、その 1 つのスロットを新しい値に設定する必要があります。
宿題のにおいがするので、おそらくArrayListは許可されません(?)
「インデックスをシフトする」方法を探す代わりに、新しい配列を構築するだけかもしれません。
int[] b = new int[a.length +1];
それで
//編集: もちろん、インデックスではなく値をコピーします
何かが欠けていない限り、問題は配列のサイズを大きくすることではありません。この例では、配列のサイズは同じままです。(ビット シフトのようなものです。) この場合、新しい配列を作成したりコピーしたりする理由はまったくありません。これでうまくいくはずです:
static void addPos(int[] array, int pos, int value) {
// initially set to value parameter so the first iteration, the value is replaced by it
int prevValue = value;
// Shift all elements to the right, starting at pos
for (int i = pos; i < array.length; i++) {
int tmp = prevValue;
prevValue = array[i];
array[i] = tmp;
}
}
int[] a = {1, 2, 3, 4, 5, 6};
addPos(a, 4, 87);
// output: {1, 2, 3, 4, 87, 5}
これを行う準ワンライナーは次のとおりです。
String[] prependedArray = new ArrayList<String>() {
{
add("newElement");
addAll(Arrays.asList(originalArray));
}
}.toArray(new String[0]);
int[] b = new int[a.length +1];
System.arraycopy(a,0,b,0,4);
//System.arraycopy(srcArray, srcPosition, destnArray, destnPosition, length)
b[4]=87;
System.arraycopy(a,4,b,5,2);
b 配列は {1, 2, 3, 4, 87, 5,6} として作成されます。
System.arraycopy
はパフォーマンスが向上しますが、インデックスの計算が原因で正しく取得するのが困難です。jradの回答に固執するかArrayList
、パフォーマンス要件がない場合。
public static int[] insert(
int[] array, int elementToInsert, int index) {
int[] result = new int[array.length + 1];
// copies first part of the array from the start up until the index
System.arraycopy(
array /* src */,
0 /* srcPos */,
result /* dest */,
0 /* destPos */,
index /* length */);
// copies second part from the index up until the end shifting by 1 to the right
System.arraycopy(
array /* src */,
index /* srcPos */,
result /* dest */,
index + 1 /* destPos */,
array.length - index /* length */);
result[index] = elementToInsert;
return result;
}
また、JUnit4 テストで期待どおりに動作することを確認します。
@Test
public void shouldInsertCorrectly() {
Assert.assertArrayEquals(
new int[]{1, 2, 3}, insert(new int[]{1, 3}, 2, 1));
Assert.assertArrayEquals(
new int[]{1}, insert(new int[]{}, 1, 0));
Assert.assertArrayEquals(
new int[]{1, 2, 3}, insert(new int[]{2, 3}, 1, 0));
Assert.assertArrayEquals(
new int[]{1, 2, 3}, insert(new int[]{1, 2}, 3, 2));
}
public class HelloWorld{
public static void main(String[] args){
int[] LA = {1,2,4,5};
int k = 2;
int item = 3;
int j = LA.length;
int[] LA_NEW = new int[LA.length+1];
while(j >k){
LA_NEW[j] = LA[j-1];
j = j-1;
}
LA_NEW[k] = item;
for(int i = 0;i<k;i++){
LA_NEW[i] = LA[i];
}
for(int i : LA_NEW){
System.out.println(i);
}
}
}
これを試して
public static int [] insertArry (int inputArray[], int index, int value){
for(int i=0; i< inputArray.length-1; i++) {
if (i == index){
for (int j = inputArray.length-1; j >= index; j-- ){
inputArray[j]= inputArray[j-1];
}
inputArray[index]=value;
}
}
return inputArray;
}