从数组中删除项目

时间:2010-11-15 13:14:51

标签: java

class ArrayApp{

    public static void main(final String[] args){
        long[] arr; // reference to array
        arr = new long[100]; // make array
        int nElems = 0; // number of items
        int j; // loop counter
        long searchKey; // key of item to search for
        // --------------------------------------------------------------
        arr[0] = 77; // insert 10 items
        arr[1] = 99;
        arr[2] = 44;
        arr[3] = 55;
        arr[4] = 22;
        arr[5] = 88;
        arr[6] = 11;
        arr[7] = 00;
        arr[8] = 66;
        arr[9] = 33;
        nElems = 10; // now 10 items in array
        // --------------------------------------------------------------
        for(j = 0; j < nElems; j++){
            System.out.print(arr[j] + " ");
        }
        System.out.println("");
        // --------------------------------------------------------------
        searchKey = 66; // find item with key 66
        for(j = 0; j < nElems; j++){
            if(arr[j] == searchKey){
                break; // yes, exit before end
            }
        }
        if(j == nElems){
            System.out.println("Can’t find " + searchKey); // yes
        } else{
            System.out.println("Found " + searchKey); // no
        }
        // --------------------------------------------------------------
        searchKey = 55; // delete item with key 55
        for(j = 0; j < nElems; j++){
            if(arr[j] == searchKey){
                break;
            }
        }
        for(int k = j; k < nElems - 1; k++){
            arr[k] = arr[k + 1];
        }
        nElems--; // decrement size
        // --------------------------------------------------------------
        for(j = 0; j < nElems; j++){
            System.out.print(arr[j] + " ");
        }
        System.out.println("");
    } // end main()
} // end class ArrayApp
  • 为什么我们使用j和nElems进行搜索 一个数组。
  • 为什么我们再次为j分配j 删吗?我们不能从j中删除它 本身?

5 个答案:

答案 0 :(得分:0)

nElemens用于加速搜索。在上面的示例中,数组有100个字段。所以你需要搜索所有100个字段。但由于nElemen(元素数量)仅为10,因此只需搜索10个元素而不是全部100个元素。

但要小心:上面的算法假定数组以正确的顺序填充,并且在具有值的字段之间不会有任何间隙。

然后变量j用作循环变量来访问数组中的不同字段。

E.g。

arr [5]访问数组的6.字段。 arr [j]访问j。数组中的元素。有关java循环的基本信息:

http://leepoint.net/notes-java/flow/loops/loops.html

答案 1 :(得分:0)

这是从数组中删除元素的困难(更不用说很长的)方法。还有其他更简单的方法,包括:

在Java文档上查看这些内容。

答案 2 :(得分:0)

实际上,在Java中“删除”[]中的元素并不是一个好习惯。它们是静态分配的,无论如何[].length都无法更改。你想让我做什么?使用动态数组,列表等。例如,使用ArrayList

答案 3 :(得分:0)

您的想法是在java数组(具有固定大小)上实现“可调整大小”的数组。此固定数组中的第一个nElem元素是逻辑数组。现在,您希望能够在此逻辑数组中设置和删除元素:

[00] [01] [02] [03] [04] [05] [06] [07] [08] [09] ... [99] // physical array
[00] [01] [02] [03] [04] [05] [06] [07] [08]               // logical array, nElem = 9
Insert '99' at (logical) position 04
[00] [01] [02] [03] [99] [04] [05] [06] [07] [08]          // nElem = 10
Delete value at (logical) position 03
[00] [01] [02] [99] [04] [05] [06] [07] [08]               // nElem = 9

java数组的大小仍为100(已修复),每次插入和删除操作后都必须调整逻辑数组(nEleme)的大小。

如果插入元素,则必须将某些元素“移位”到“右侧”(并增加nElem)。你需要一个for循环和一个计数器(j)。如果你想删除一个元素,你必须将元素“移动”到“左边”并再次需要一个计数器。

  

为什么我们使用j和nElems来搜索数组。

要搜索(未排序)集合中的项目(数组,集合,..),您必须查看每个元素,可能从index = 0开始直到index =(nElem-1)。如果当前位置的值与您的搜索条件匹配(例如:is-equal-to),则可以中断搜索。 j存储此实际索引,nElem(逻辑)数组的大小,以便(nElem-1)此(逻辑)数组中最后一个元素的索引)

  

为什么我们再次将j分配给k进行删除?我们不能从j本身删除它吗?

仅仅是为了可读性。这也可以,但更难理解。

for(j = 0; j < nElems; j++) {
   if(arr[j] == searchKey) {
       break;
   }
}
for(;j < nElems-1; j++) {  // note the missing initialzing value for the loop
   arr[j] = arr[j+1];
}

答案 4 :(得分:0)

如果您有Apache的commons-lang libary,您可以尝试

inputArray = ArrayUtils.remove(inputArray , indexOfElement);

该方法返回一个新数组,该数组是通过从原始数组中删除找到的元素而创建的。