我有一个实现接口的类,我想当我尝试将一个元素多次插入到数组中时,会忘记第一次插入。我真的无法想出这个。这就是我所拥有的:
public void insertElementAt(int index, E el)
throws IllegalArgumentException {
Object temp[] = new Object[data.length + 1];
for (int i = 0; i < data.length; i++) {
if (i == index){
temp[index] = el;
temp[i + 1] = data[i];
i++;
}
temp[i] = data[i];
}
data = temp;
if (index > data.length || index < 0) {
throw new IllegalArgumentException();
}
}
然后我的测试报告null
而不是他最后一次断言的第一次。
@Test
public void testInsertToLeft() {
PriorityList<String> list = new ArrayPriorityList<String>();
list.insertElementAt(0, "First");
// Must shift array elements in this case
list.insertElementAt(0, "New First");
assertEquals("New First", list.getElementAt(0));
assertEquals("First", list.getElementAt(1));
}
答案 0 :(得分:1)
你必须这样做:
public void insertElementAt(int index, E el) throws IllegalArgumentException {
Object temp[] = new Object[data.length + 1];
for (int i = 0; i < data.length; i++) {
if (i >= index){
temp[i + 1] = data[i];
} else {
temp[i] = data[i];
}
}
temp[index] = el;
data = temp;
if (index > data.length || index < 0) {
throw new IllegalArgumentException();
}
}
删除它:
public void removeElementAt(int index) throws IllegalArgumentException {
Object temp[] = new Object[data.length - 1];
for (int i = 0; i < temp.length; i++) {
if (i > index){
temp[i - 1] = data[i];
} else {
temp[i] = data[i];
}
}
data = temp;
if (index > data.length || index < 0) {
throw new IllegalArgumentException();
}
}
答案 1 :(得分:0)
尝试将for循环更改为:
for (int i = 0; i < data.length; i++) {
if (i == index){
temp[index] = el;
temp[i + 1] = data[i];
i++;
}else{
temp[i] = data[i];
}
}
或
for (int i = 0; i < data.length; i++) {
if (i == index){
temp[index] = el;
temp[i + 1] = data[i];
i++;
continue;
}
temp[i] = data[i];
}
答案 2 :(得分:0)
列表为空时data.length是什么?如果在第一次插入时为空,则不会进入for循环但复制临时数组,它将在下次插入时进入循环,长度为1.第一次插入将被跳过。
答案 3 :(得分:0)
我会这样做:
public static void insertElementAt(int index, E el)
throws IllegalArgumentException {
if (index > data.length || index < 0) {
throw new IllegalArgumentException();
}
Object temp[] = new Object[data.length + 1];
for (int i = index; i < data.length; i++) {
temp[i+1] = data[i];
}
temp[index] = el;
data = temp;
}
答案 4 :(得分:0)
您应首先测试有效参数(“早期失败”),并且您可以充分利用JDK的实用方法为您解决:
public static void insertElementAt(int index, E el) {
if (index > data.length || index < 0) {
throw new IllegalArgumentException();
}
data = Arrays.copyOf(data, data.length + 1);
System.arrayCopy(data, index, data, index + 1, data.length - index);
data[index] = el;
}
另请注意,您无需声明throws
,因为IllegalArgumentException
是未经检查的例外,因此我将其删除。通常,人们遵循这种模式。