正在研究addBefore()方法,该方法将一个新元素添加到int数组的开头,然后使现有元素的索引增加一个。
这是尝试运行时控制台中显示的内容- java.lang.RuntimeException:索引1应该具有值11,但应具有0 在IntArrayListTest.main(IntArrayListTest.java:67)
下面是我到目前为止的代码。
ssh -t user@host 'mysql -u dbuser -p database < ~/data.sql'
答案 0 :(得分:0)
无论是首先添加还是最后添加,如果阵列已满,则只需增加阵列大小即可。
count
字段似乎与length
完全相同,而index
似乎未使用且毫无意义,因此请将它们都删除。
要重新排列数组中的值,请使用以下方法:
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
然后您应该使用两个“添加”方法:
public class IntArrayList {
private int[] a; // Underlying array
private int length; // Number of added elements in a
// other code
public void add(int x) {
if (length == a.length) {
int[] b = new int[a.length * 2];
System.arraycopy(a, 0, b, 0, length);
a = b;
}
a[length++] = x;
}
public void addBefore(int x) {
if (length < a.length) {
System.arraycopy(a, 0, a, 1, length);
} else {
int[] b = new int[a.length * 2];
System.arraycopy(a, 0, b, 1, length);
a = b;
}
a[0] = x;
length++;
}
}
答案 1 :(得分:0)
如果答案要求您自己循环播放,则类似这样的方法应该可以正常工作(执行此操作的几种方法之一,但是是O(n)
):
public void addBefore(int x) {
if(length + 1 >= a.length){
int[] b = new int[a.length*2];
b[0] = x;
for (int i = 0; i < length; i++) {
b[i + 1] = a[i];
}
a = b;
} else {
for (int i = length; i >= 0 ; i--) {
a[i + 1] = a[i];
}
a[0] = x;
}
length++;
}
我注意到它开始运行“速度测试”-不知道这样的测试有多有用,因为它将基于cpu性能,而不是测试算法的复杂性。
答案 2 :(得分:0)
您的解决方案遇到三个问题:
每次调用该方法时,您都会增加a
的长度。这样会很快创建一个OutOfMemoryException
当您将值从a
复制到b
时,您执行了b[i+a.length] = a[i];
,这意味着这些值将被复制到b
的中间,而不仅仅是移位一个地方
最后,将新值放在数组的末尾而不是开头。
所有这些我能看到,因为我在代码上使用了调试器。如果您希望能够检测并修复代码中的问题,则需要开始使用此工具。
因此固定解决方案可以做到这一点:
检查a
是否已满(就像使用add()
方法一样),如果是,则创建b
,并将所有内容复制到其中,依此类推)< / p>
将所有值向前移动一位。最简单的方法是从长度向后循环到0
在数组开头分配新值
这是一个可行的解决方案:
public void addBefore(int x) {
// increase length if a is full
if (length >= a.length) {
int[] b = new int[a.length * 2];
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
a = b;
}
// shift all values one cell ahead
for (int i = length; i > 0; i--) {
a[i] = a[i-1];
}
// add new value as first cell
a[0] = x;
length ++;
}
}
答案 3 :(得分:-1)
您可以使用Colt库中的现有Java方法。这是一个使用Python语法的小示例(为了使示例代码变小,我使用了Jython):
from cern.colt.list import IntArrayList
a=IntArrayList()
a.add(1); a.add(2) # add two integer numbers
print "size=",a.size(),a
a.beforeInsert(0, 10) # add 10 before index 0
print "size=",a.size(),a
您可以使用DataMelt程序来运行此代码。上面代码的输出是:
size= 2 [1, 2]
size= 3 [10, 1, 2]
如您所见,在1之前插入10(并且大小增加了) 随意将编码更改为Java,即将此类导入为
import cern.colt.list.IntArrayList
IntArrayList a= new IntArrayList()
答案 4 :(得分:-1)
您可以改用ArrayList,然后将其隐藏到Integer [] Array中,这可以简化您的代码。下面是一个示例: 首先创建ArrayList:
ArrayList<Integer> myNums = new ArrayList<Integer>();
接下来,您可以添加所需的值,但是我选择仅添加数字2-5,以说明我们可以将数字1作为第一个索引,并自动将每个值增加一个索引。这样可以简化您的addBefore()方法,例如:
public static void addBefore(ArrayList<Integer> aList) {
int myInt = 1;
aList.add(0, myInt);
}
由于您的ArrayList在Java中只有一个内存位置,因此更改方法中的Array就可以了(这对于常规Array也可以)。然后,我们可以将任何值添加到ArrayList的开头。如果需要,可以将Integer作为第二个参数(int x)传递给此方法,但是我只是创建了myInt原语以简化代码。我知道在您的代码中您有(int x)参数,您可以将其添加到此方法中。您可以使用ArrayList.add()方法将int添加到Array的索引0,这将使每个Array元素增加1个位置。接下来,您将需要调用该方法:
addBefore(myNums);//You can add the int x parameter and pass that as an arg if you want here
接下来,我们可以使用ArrayList.toArray()方法将ArrayList转换为Integer Array。下面是一个示例:
Integer[] integerHolder = new Integer[myNums.size()];
Integer[] numsArray = (Integer[])myNums.toArray(integerHolder);
System.out.println(Arrays.toString(numsArray));
首先,我们将创建一个与您的ArrayList大小相同的ArrayHolder,然后创建将存储ArrayList元素的Array。我们将myNums.toArray()转换为Integer Array。结果如下。数字1将在索引0处,其余元素将增加1索引:
[1, 2, 3, 4, 5]
您可以在addBefore()方法中完成整个过程,方法是将Array转换为该方法中的ArrayList,并将(int x)添加到ArrayList的0索引,然后再将其转换回Array。由于ArrayList只能接受一个包装器类对象,因此您只需要将int原语Array转换为Integer类型即可使用,但它简化了addBefore()方法。