在不使用库的情况下从数组列表中删除元素。 Java

问题描述:

我已经实现了一个从数组列表中删除一个元素的函数。我不应该ArrayList库!见下面我的代码:在不使用库的情况下从数组列表中删除元素。 Java

/** 
* removes a LendItem at a specified (index) position. 
* This functions returns the item removed from the list or null if no such item exists. This 
* function leaves no gaps, that means all items after the removed item are shifted one position. 
* @param list is the item to be removed 
* @param n is the index of the item to be removed 
* @return the removed item 
*/ 

public static LendItem remove(LendItemArrayList list, int n) { 

    if (list.next == 0) { 
     return null; 
    } 

    if (n < 0 || n > list.INITIAL_SIZE) { 
     return null; 
    } 

    LendItem itemToBeRemoved = list.lendItems[n]; // itemToBeRemoved is the item which has the index n, which we want to remove from the list. 
    int i; 
    for (i = n; i < list.next - 1; i++) { // iterate through the list, starting where the index of the itemToBeRemoved is. 
     list.lendItems[i] = list.lendItems[i + 1]; 
    } 

    list.lendItems[i] = null; 
    list.next--; 
    return itemToBeRemoved; 
} 

这里是类:

public class LendItemArrayList { 

    int INITIAL_SIZE = 20; 
    boolean resizeable = false; 
    LendItem[] lendItems = new LendItem[INITIAL_SIZE]; 
    int next = 0; 
} 

我与已经提供了一些测试方法测试了我的功能,我只选择失败的其中之一。具体地,测试被称为:

removeNonExistingElement 

和它失败这样的:

java.lang.AssertionError: 10 elements have been added, next should be 10 (no changes) but found 9.

编辑: 添加了add()函数。

public static boolean add(LendItemArrayList list, LendItem p) { 

    if (list.next == list.lendItems.length) { 
     if (list.resizeable == false) { 
      return false; 
     } 
    } 

    if (list.next == list.lendItems.length) { 
     if (list.resizeable == true) { 

      LendItem[] resizedList = new LendItem[list.lendItems.length*2]; 

      for (int i = 0; i < list.next; i++) {       
       resizedList[i] = list.lendItems[i];       
      } 

      list.lendItems = resizedList; 

     } 
    } 

    list.lendItems[list.next++] = p;           
    return true; 
} 

保持原样,因为它检查索引是否超出范围。

if (n < 0 || n >= list.INITIAL_SIZE) { 
       return null; 
    } 

接下来,添加这行代码:

if (list.lendItems[n] == null) { 
      return null; 
     } 

之后,你可能会或可能不会添加if语句,检查如果给定的列表是空的。除非需要使用,否则没有区别。

if (list.next == 0){ 
      return null; 
     } 
+0

非常感谢。现在它可以工作。最好的祝福。 –

变化

这一行:

if (n < 0 || n > list.INITIAL_SIZE) { 

向该:

if (n < 0 || n >= list.INITIAL_SIZE) { 

>=意味着大于或等于。如果n == list.INITIAL_SIZE,那么这个项目也不能被删除,因为由于索引从0开始,列表中的最后一个值的索引大小为-1。这是当你开始编程时会伤害到你的大脑的东西之一。

+0

你的意思是,比较索引与初始大小而不是实际大小不是一个错误吗? – Holger

+0

@Holger使用提供的代码,初始大小不会改变,但是如果您认为某些隐藏的“add”方法的大小更改比这是一个好的方法。 – DoubleDouble

+0

@DoubleDouble:正好。因此,您可以重复调用remove方法,使其正面索引小于INITIAL_SIZE,直到实际大小(其荒谬名称为next)变得小于该索引,从而有效地移除其他索引处的项目... – Holger