有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在数组中插入元素

我有一个实现接口的类,我想当我多次尝试将元素插入数组时,第一次插入都会被忘记。我真的搞不懂这个。这就是我所拥有的:

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

共 (5) 个答案

  1. # 1 楼答案

    我会这样做:

    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;
    

    }

  2. # 2 楼答案

    你必须这样做:

    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();
        }
    }
    
  3. # 3 楼答案

    您应该首先对有效参数进行测试(“fail early”),您可以充分利用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是一个未选中的异常,所以我删除了它。通常情况下,人们会遵循这种模式

  4. # 4 楼答案

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

  5. # 5 楼答案

    尝试将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];
        }