【问题标题】:Removing a element from an array list without using libraries. Java在不使用库的情况下从数组列表中删除元素。爪哇
【发布时间】:2015-12-08 17:24:00
【问题描述】:

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

/**
 * 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 个元素,接下来应该是 10 个(没有变化)但找到了 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;
}

【问题讨论】:

    标签: java class arraylist


    【解决方案1】:

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

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

    接下来,添加这行代码:

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

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

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

    【讨论】:

      【解决方案2】:

      改变这一行:

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

      到这里:

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

      &gt;= 表示大于或等于。如果n == list.INITIAL_SIZE,那么该项目也不能被删除,因为由于索引从 0 开始,列表中的最后一个值的索引大小为 - 1。当你开始编程时,这是伤害你大脑的事情之一。

      【讨论】:

      • 您的意思是,将索引与初始大小而不是实际大小进行比较首先不是错误吗?
      • @Holger 使用提供的代码,初始大小不会改变,但如果您假设在某些隐藏的add 方法中大小会发生变化,那将是一个好点。
      • @DoubleDouble:完全正确。因此,您可以使用小于INITIAL_SIZE 的正索引重复调用 remove 方法,直到实际大小(具有荒谬的名称next)变得比该索引更小,从而有效地删除其他索引处的项目......
      • @Holger next 是列表中实际值的数量(我同意这是一个坏名字),而 INITIAL_SIZE 是后备数组的大小(最初充满空值)。据我们所知,后备数组的大小永远不会改变,因此n 永远不会大于INITIAL_SIZEnext 不会通过 remove 变为负数,因为如果是 0 它会返回 null
      • @DoubleDouble:我已经更新了我的评论。它不是负数,而是降至零。想想会发生什么,如果我拨打remove(9) 十次。之后,next 将为零……检查删除索引的有效性应包含实际大小,而不是支持数组的大小。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 2022-01-22
      • 2019-04-04
      相关资源
      最近更新 更多