0

我有一个实现接口的类,我想当我尝试将一个元素插入到数组中时,不止一次忘记了第一次插入。我实在想不通这个。这就是我所拥有的:

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

5 回答 5

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();
    }
}
于 2013-10-08T20:39:55.897 回答
0

I would do this:

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;

}

于 2013-10-08T20:48:48.890 回答
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;
}

另请注意,您不需要声明 a throws,因为IllegalArgumentException它是未经检查的异常,因此我将其删除。通常,人们遵循这种模式。

于 2013-10-08T20:49:46.340 回答
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];
    }
于 2013-10-08T20:36:26.627 回答
0

当列表为空时,data.length 是什么?如果它在第一次插入时为空,则不会进入 for 循环,而是复制 temp 数组,它将在下一次插入时进入长度为 1 的循环。第一次插入将被跳过。

于 2013-10-08T20:38:23.897 回答