我需要向数组添加一个指定位置和值的元素。例如,我有数组
int []a = {1, 2, 3, 4, 5, 6};
应用后addPos(int 4, int 87)
应该是
int []a = {1, 2, 3, 4, 87, 5};
我知道这里应该是 Array 的索引的转变,但看不到如何在代码中实现它。
这应该可以解决问题:
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;
}
wherea
是原始数组,pos
是插入的位置,num
是要插入的编号。
最简单的方法是使用 anArrayList<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
复制前缀和后缀,并将该插槽设置为新值。
如果您更喜欢使用 Apache Commons 而不是重新发明轮子,那么当前的方法是:
a = ArrayUtils.insert(4, a, 87);
它曾经是 ArrayUtils.add(...) 但不久前已被弃用。更多信息在这里: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}
这是一个 quasi-oneliner 可以做到这一点:
String[] prependedArray = new ArrayList<String>() {
{
add("newElement");
addAll(Arrays.asList(originalArray));
}
}.toArray(new String[0]);
看看公地。它使用arrayCopy(),但语法更好。对于那些用逐个元素的代码来回答的人:如果这不是家庭作业,那是微不足道的,有趣的答案是促进重用的答案。对于那些提出列表的人:可能读者也知道这一点,应该提到性能问题。
org.apache.commons.lang3.ArrayUtils#add(T[], int, T)
在最新的 commons lang3 中已弃用,您可以org.apache.commons.lang3.ArrayUtils#insert(int, T[], T...)
改用。
已弃用此方法已被 insert(int, T[], T...) 取代,并且可能在未来的版本中被删除。请注意,新方法对 null 输入数组的处理有所不同:将 X 插入 null 数组会导致 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});
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 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 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);
}
}
}
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);
}
}
}