在不使用库的情况下从数组列表中删除元素。 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;
}
这一行:
if (n < 0 || n > list.INITIAL_SIZE) {
向该:
if (n < 0 || n >= list.INITIAL_SIZE) {
>=
意味着大于或等于。如果n == list.INITIAL_SIZE
,那么这个项目也不能被删除,因为由于索引从0开始,列表中的最后一个值的索引大小为-1。这是当你开始编程时会伤害到你的大脑的东西之一。
你的意思是,比较索引与初始大小而不是实际大小不是一个错误吗? – Holger
@Holger使用提供的代码,初始大小不会改变,但是如果您认为某些隐藏的“add”方法的大小更改比这是一个好的方法。 – DoubleDouble
@DoubleDouble:正好。因此,您可以重复调用remove方法,使其正面索引小于INITIAL_SIZE,直到实际大小(其荒谬名称为next)变得小于该索引,从而有效地移除其他索引处的项目... – Holger
非常感谢。现在它可以工作。最好的祝福。 –