2012-07-24 63 views
11

我需要为Array指定位置和值添加一个元素。 例如,我有阵如何添加元素到数组和移位索引?

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

应用addPos(INT 4,诠释87)之后,它应该是

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

据我所知,这里应该是数组的索引的转变,但不要看看如何在代码中实现它。

+0

你不能在Java数组移位索引。数组的大小是固定的。用你想要的值创建新数组,并将引用'a'分配给新数组。 – kosa 2012-07-24 19:41:57

+0

作业?如果是这样,请将其标记为。 – 2012-07-24 19:49:43

+0

现在太迟了,因为已经有一个完整的代码答案。 – 2012-07-24 19:52:02

回答

6

这样做最简单的方法是使用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); 
+0

我只需要使用数组。 – devger 2012-07-24 19:42:49

+1

该方法是'add(int index,T element)',而不是'insert'。 – 2012-07-24 19:46:01

+0

@danielkullmann:是的!谢啦!编辑:D – 2012-07-24 19:46:41

4

我闻到的功课,所以大概一个ArrayList将不会被允许

而不是寻找一种方式来“移位索引”,也许只是建立一个新的数组(?):

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

然后

  1. 拷贝索引形式阵列一个从零计数到插入positio ñ
  2. ...
  3. ...

//编辑:当然副本值,而不是指标

7

你必须做出新的数组,使用System.arraycopy复制的前缀和后缀,并将该插槽设置为新值。

12

这应该做的伎俩:

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要被插入的数量。

+10

'System.arraycopy'肯定会是一个更好的解决方案。 – 2012-07-24 19:44:53

+0

确实。我不知道这是内置的。 – jrad 2012-07-24 19:45:27

+0

谢谢杰克,那帮了我。 – devger 2012-07-24 20:02:54

2

这里是一个准oneliner,做它:

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

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

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; 
} 
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); 
     } 
    } 
} 
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};

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)); 
} 
1

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; 
} 
1

org.apache.commons.lang3.ArrayUtils#add(T[], int, T)在最新的公共lang3弃用,你可以使用org.apache.commons.lang3.ArrayUtils#insert(int, T[], T...)代替。

已弃用此方法已被insert(int,T [],T ...)取代,并可能在将来的版本中被删除。请注意空输入数组的处理不同,在新的方法:将X成空空数组结果未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});