簡體   English   中英

從Java中的數組中刪除項目

[英]Delete item from array in Java

怎么了 我想從數組中刪除一個項目,但是它顯示了我

錯誤ArrayIndexOutBound異常

public class delete {

    public static void main(String[]args) {
        int i;

        //delete  item from array
        int k[] = new int[]{77,99,44,11,00,55,66,33,10};

        //delete 55
        int searchkey=55;

        int nums=k.length;
        for ( i=0;i<nums;i++)
            if (k[i]==searchkey)
                break;

        for (int t=i;t<nums;t++)
            k[t]=k[t+1];
        nums--;

        for (int m=0;m<nums;m++) {
            System.out.println(k[m]);
        }
    }
}
for (int t=i;t<nums-1;t++)  //Should be -1 here, as k[t+1] will be out of bounds if t = nums-1

或者另一種變體,以nums--您移動號碼前

nums--;
for (int t=i;t<nums;t++)
   k[t]=k[t+1];

以下重寫應具有指導意義:

public class Delete {
    static int search(int key, int[] arr) {
        for (int i = 0; i < arr.length; i++)
            if (arr[i] == key) {
                return i;
            }
        return -1;
    }
    static void print(int[] arr, final int L) {
        for (int i = 0; i < L; i++) {
            System.out.println(arr[i]);
            // try this also:
            // System.out.format("%02d ", arr[i]);          
        }
    }
    public static void main(String[] args) {
        int nums[] = { 77, 99, 44, 11, 00, 55, 66, 33, 10 };
        final int N = nums.length;
        int searchKey = 55;

        int pos = search(searchKey, nums);
        for (int t = pos; t < N-1; t++) {
            nums[t] = nums[t + 1];
        }
        print(nums, N-1);
        // prints 77, 99, 44, 11, 0, 66, 33, 10
        System.out.println(010 == 8); // prints "true"
        System.out.println(00000); // prints "0
    }
}

以下是一些主要觀察結果:

  • 將邏輯分解為輔助方法。 這使得邏輯組件更易於測試和重用,並且整體邏輯更易於理解。
  • 如果使用諸如N類的final局部變量來表示int[] nums的初始大小,並使用NN-1等來定義其余邏輯,它會使代碼更易於理解。
    • final變量越多,隨着它們的值隨時間變化,就越難理解發生了什么
  • 遵循編碼約定 特別是,類名以大寫字母開頭。
  • 小心數組中的00 0前綴用於八進制文字。 即, 010 == 8
  • 請注意, 00打印為簡單0 在數值上, 00 = 000 = 0000 = 0 如果您需要對此進行零填充,那么這就是格式問題。

也可以看看

關於八進制字面量

在零填充時

在以下循環中

for (int t=i;t<nums;t++)
   k[t]=k[t+1];

當t指向最后一個元素時,k [t + 1]操作將拋出一個異常,這是您現在所得到的。

    for (int t=i;t<nums;t++)
      k[t]=k[t+1];

只需將nums替換為nums-1,因為您已經刪除(跳過)了一個元素。

我發現它可以通過以下方式發揮最佳效果:

確保迭代不超出倒數第二個元素(array.length-1),以便它可以與以下元素進行比較:

for(int i=elementPosition-1;i<array.length-1;i++){array[i]=array[i+1];}
import java.util.ArrayList;
import java.util.Arrays;

public class Sort {
    public static void main(String a[]) {
        int swap;
        int length;
        int[] unsorted = { 1, 2, 4, 3, 6, 5, 7, 8, 18, 17, 65, 46, 2, 4, 5, 3,
                4 };
        length = unsorted.length;
        for (int i = 0; i < length; i++) {
            for (int j = i + 1; j < length; j++) {
                if (unsorted[i] > unsorted[j]) {
                    swap = unsorted[i];
                    unsorted[i] = unsorted[j];
                    unsorted[j] = swap;
                } else if (unsorted[i] == unsorted[j]) {
                    for (int k = j; k < length - 1; k++) {
                        unsorted[k] = unsorted[k + 1];
                    }
                    length -= 1;
                }
            }
        }
        for (int i = 0; i < length; i++) {
            System.out.println(" " + i + "th element " + unsorted[i]);
        }
    }
}

關於k[t]=k[t+1]; 您遇到錯誤es k[t+1]嘗試訪問索引為9的第10個元素,但您的數組包含9個元素。 因此,您獲得了超出范圍的數據。

如果您像Draco Ater所說的那樣使用它,它將起作用:

for (int t=i;t<nums-1;t++) {
    k[t]=k[t+1];
}
nums--;

輸出為:77 99 44 11 0 66 33 10

這應該是正確的。 ;-)

暫無
暫無

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

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