簡體   English   中英

將元素插入數組

[英]Inserting elements into array

我有一個實現接口的類,我想當我嘗試一次將元素插入數組中的次數超過一次被忘記的時候。 我真的不知道這一點。 這就是我所擁有的:

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

您必須這樣做:

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

嘗試將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];
    }

列表為空時什么是data.length? 如果在第一次插入時為空,則不會進入for循環,而是復制temp數組,它將在下一次插入時以長度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;

}

您應該首先對有效參數進行測試(“較早失敗”),並且可以充分利用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未經檢查的異常,因此我將其刪除。 通常,人們遵循這種模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM