如何向Array添加元素并移动索引?

时间:2012-07-24 19:39:22

标签: java arrays

我需要在Array中添加一个指定位置和值的元素。 例如,我有数组

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

应用addPos(int 4, int 87)之后应该是

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

我知道这应该是Array索引的转换,但是看不到如何在代码中实现它。

15 个答案:

答案 0 :(得分: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是要插入的数字。

答案 1 :(得分:8)

最简单的方法是使用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);

答案 2 :(得分:7)

您必须创建一个新数组,使用System.arraycopy复制前缀和后缀,并将该一个插槽设置为新值。

答案 3 :(得分:5)

Jrad解决方案很好,但我不喜欢他没有使用数组副本。在内部,System.arraycopy()执行本机调用,因此您可以获得更快的结果。

df['amt_prior'] = df.groupby(['company', 'quarter']).amt.shift()
df['year_prior'] = df.groupby(['company', 'quarter']).year.shift()


    amt company quarter year    amt_prior   year_prior
0   -1.309558   A   2   1       NaN         NaN
1   0.579060    A   2   2       -1.309558   1.0
2   -0.373324   A   2   3       0.579060    2.0
3   -0.515989   B   3   1       NaN         NaN
4   1.013687    B   4   3       NaN         NaN
5   1.419462    B   4   4       1.013687    3.0
6   -0.918983   C   1   2       NaN         NaN
7   0.121057    C   1   3       -0.918983   2.0
8   -0.188670   C   3   4       NaN         NaN

答案 4 :(得分:4)

我闻到了作业,所以可能不允许使用ArrayList(?)

不是寻找“转移索引”的方法,而是建立一个新的数组:

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

然后

  1. 复制索引从数组 a 从零开始计数到插入位置
  2. ...
  3. ...
  4. //编辑:当然复制值,而不是索引

答案 5 :(得分:2)

这是一个准上线者:

String[] prependedArray = new ArrayList<String>() {
  {
    add("newElement");
    addAll(Arrays.asList(originalArray));
  }
}.toArray(new String[0]);

答案 6 :(得分:2)

看看commons。它使用arrayCopy(),但语法更好。对于那些使用逐个元素代码回答的人:如果这不是家庭作业,那是微不足道的,而有趣的答案就是促进重用的答案。对于那些提出名单的人:可能读者也应该知道这一点,并且应该提到性能问题。

答案 7 :(得分:2)

除非我遗漏了某些内容,否则问题不在于增加数组大小。在示例中,数组大小保持不变。 (就像一点点转移。)  在这种情况下,实际上没有理由创建新数组或复制它。这应该可以解决问题:

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}

答案 8 :(得分:1)

在最新的公共语言lang3中不推荐使用

org.apache.commons.lang3.ArrayUtils#add(T[], int, T),您可以使用org.apache.commons.lang3.ArrayUtils#insert(int, T[], T...)代替。

  

不推荐使用此方法已被insert(int,T [],T ...)取代,并且可能会在将来的版本中删除。请注意,在新方法中,null输入数组的处理有所不同:将X插入空数组会导致null而不是X

示例代码:

    Assert.assertArrayEquals
            (org.apache.commons.lang3.ArrayUtils.insert
            (4, new int[]{1, 2, 3, 4, 5, 6}, 87), new int[]{1, 2, 3, 4, 87, 5, 6});

答案 9 :(得分:1)

如果您更喜欢使用Apache Commons而不是重新发明轮子,那么目前的方法是:

a = ArrayUtils.insert(4, a, 87);

它曾经是ArrayUtils.add(...)但不久前已弃用。更多信息:1

答案 10 :(得分: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;
}

答案 11 :(得分: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);
        }
     }
}

答案 12 :(得分: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,85,5,6};

答案 13 :(得分: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));
}

答案 14 :(得分:0)

以下代码将在指定位置插入元素,并将现有元素移动到新元素旁边。

public class InsertNumInArray {

public static void main(String[] args) {
    int[] inputArray = new int[] { 10, 20, 30, 40 };
    int inputArraylength = inputArray.length;
    int tempArrayLength = inputArraylength + 1;
    int num = 50, position = 2;
    int[] tempArray = new int[tempArrayLength];

    for (int i = 0; i < tempArrayLength; i++) {
        if (i != position && i < position)
            tempArray[i] = inputArray[i];
        else if (i == position)
            tempArray[i] = num;
        else
            tempArray[i] = inputArray[i-1];
    }

      inputArray = tempArray;

    for (int number : inputArray) {
        System.out.println("Number is: " + number);
    }
}
}