18

位置と値を指定する要素を配列に追加する必要があります。たとえば、私は配列を持っています

int []a = {1, 2, 3, 4, 5, 6};

適用後addPos(int 4, int 87)

int []a = {1, 2, 3, 4, 87, 5};

ここで配列のインデックスをシフトする必要があることは理解していますが、コードでそれを実装する方法がわかりません。

4

15 に答える 15

14

これでうまくいくはずです:

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される番号です。

于 2012-07-24T19:44:24.613 に答える
14

これを行う最も簡単な方法は、と メソッド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);
于 2012-07-24T19:41:34.567 に答える
9

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;
}
于 2017-09-26T20:35:36.790 に答える
8

新しい配列を作成し、それを使用System.arraycopyしてプレフィックスとサフィックスをコピーし、その 1 つのスロットを新しい値に設定する必要があります。

于 2012-07-24T19:43:59.997 に答える
4

宿題のにおいがするので、おそらくArrayListは許可されません(?)

「インデックスをシフトする」方法を探す代わりに、新しい配列を構築するだけかもしれません。

int[] b = new int[a.length +1];

それで

  1. ゼロから挿入位置までカウントする配列からインデックスをコピーする
  2. ...
  3. ...

//編集: もちろん、インデックスではなく値をコピーします

于 2012-07-24T19:43:33.740 に答える
4

何かが欠けていない限り、問題は配列のサイズを大きくすることではありません。この例では、配列のサイズは同じままです。(ビット シフトのようなものです。) この場合、新しい配列を作成したりコピーしたりする理由はまったくありません。これでうまくいくはずです:

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}
于 2018-03-12T14:29:16.250 に答える
2

これを行う準ワンライナーは次のとおりです。

String[] prependedArray = new ArrayList<String>() {
  {
    add("newElement");
    addAll(Arrays.asList(originalArray));
  }
}.toArray(new String[0]);
于 2014-06-20T13:26:00.397 に答える
1
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} として作成されます。

于 2016-08-15T06:40:35.600 に答える
0

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));
}
于 2016-11-23T03:24:12.950 に答える
0
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);
        }
     }
}
于 2016-08-01T04:35:53.523 に答える
0

これを試して

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;
}
于 2016-06-14T20:21:25.893 に答える