我需要为Array指定位置和值添加一个元素。 例如,我有阵如何添加元素到数组和移位索引?
int []a = {1, 2, 3, 4, 5, 6};
应用addPos(INT 4,诠释87)之后,它应该是
int []a = {1, 2, 3, 4, 87, 5};
据我所知,这里应该是数组的索引的转变,但不要看看如何在代码中实现它。
我需要为Array指定位置和值添加一个元素。 例如,我有阵如何添加元素到数组和移位索引?
int []a = {1, 2, 3, 4, 5, 6};
应用addPos(INT 4,诠释87)之后,它应该是
int []a = {1, 2, 3, 4, 87, 5};
据我所知,这里应该是数组的索引的转变,但不要看看如何在代码中实现它。
这样做最简单的方法是使用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);
我只需要使用数组。 – devger 2012-07-24 19:42:49
该方法是'add(int index,T element)',而不是'insert'。 – 2012-07-24 19:46:01
@danielkullmann:是的!谢啦!编辑:D – 2012-07-24 19:46:41
我闻到的功课,所以大概一个ArrayList将不会被允许
而不是寻找一种方式来“移位索引”,也许只是建立一个新的数组(?):
int[] b = new int[a.length +1];
然后
//编辑:当然副本值,而不是指标
你必须做出新的数组,使用System.arraycopy
复制的前缀和后缀,并将该插槽设置为新值。
这应该做的伎俩:
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
要被插入的数量。
这里是一个准oneliner,做它:
String[] prependedArray = new ArrayList<String>() {
{
add("newElement");
addAll(Arrays.asList(originalArray));
}
}.toArray(new String[0]);
看一看commons。它使用arrayCopy(),但有更好的语法。对那些用逐个元素代码来回答的人来说:如果这不是家庭作业,那很简单,有趣的答案是促进重用的那个。对于那些提出名单的人:可能读者也知道这一点,应该提及性能问题。
尝试此
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;
}
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);
}
}
}
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));
}
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;
}
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});
你不能在Java数组移位索引。数组的大小是固定的。用你想要的值创建新数组,并将引用'a'分配给新数组。 – kosa 2012-07-24 19:41:57
作业?如果是这样,请将其标记为。 – 2012-07-24 19:49:43
现在太迟了,因为已经有一个完整的代码答案。 – 2012-07-24 19:52:02