[英]Implementation of Bag using only a Java Array
我几乎已经正确实施了整个 Bag class,并且它已被证明可以工作,除了这个 remove 方法。 整体时间复杂度应该是O(length)。 我试图通过将要删除的元素移动到数组的末尾并将其与最后一个元素交换来实现这一点。 然后,我使用 Arrays.copyOf() 截断数组。
public void remove(String s)
{
for (int i = 0; i < length; i++) {
if(bag[i].equals(s)){
// Adding bag[i] to end of array:
if (length == SIZE){
SIZE *= 2;
bag = Arrays.copyOf(bag, SIZE);
}
bag[length] = bag[i];
// Moving last element to bag[i]:
bag[i] = bag[length-1];
bag = Arrays.copyOf(bag, length-1);
length--;
}
}
}
如果您查看我的 output,删除成功并删除了“Cucumber”,但是当我 go 删除列表中的第一个元素“Cabbage”时,它会导致索引越界错误。
Output:
ADD Guava
Bag: {Cabbage, Cucumber, Broccoli, Banana, Broccoli, Guava}
REMOVE Cucumber
Bag: {Cabbage, Guava, Broccoli, Banana, Broccoli}
REMOVE Cucumber
Bag: {Cabbage, Guava, Broccoli, Banana, Broccoli}
REMOVE Cabbage
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
at ArrayBag.remove(ArrayBag.java:84)
at Main.<init>(Main.java:53)
at Main.main(Main.java:15)
Process finished with exit code 1
如果能帮助我理解为什么会出现此错误,我将不胜感激。 谢谢!
包是事物的无序集合。 移除包中项目的最快方法是用数组中的最后一项替换它并递减计数。 以下是您将如何删除一个项目。 我删除了void add(String item)
和String toString()
方法,只显示了 remove 方法。 O(n) 因为线性搜索数组中的项目。
class Bag {
private String[] items = new String[100];
private int size = 0;
void remove(String item){
int index = indexOf(item);
if (index >= 0)
items[index] = items[--size];
}
private int indexOf(String item){
for(int i=0; i<size; i++)
if (items[i].equals(item))
return i;
return -1;
}
}
用法示例:
public class Main{
public static void main(String[] args) {
Bag b = new Bag();
b.add("apple");
b.add("banana");
b.add("orange");
System.out.println(b);
b.remove("banana");
System.out.println(b);
b.remove("apple");
System.out.println(b);
}
}
Output
Bag [apple, banana, orange]
Bag [apple, orange]
Bag [orange]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.