因此,我有一个实现Iterable的类来编写一组方法。他们中的大多数都很简单,但是,我很难为该课程写一个删除方法。为实现Iterable的类编写移除方法
import java.util.Iterator;
public class Bag<Item> implements Iterable<Item> {
private Item[] data = (Item[]) new Object[5];
// The size variable keeps track of how many items
private int size = 0;
public String toString() {
StringBuilder b = new StringBuilder("[");
for (Item i : this)
b.append(i + " ");
return b.toString() + "]";
}
public void expandArray() {
int capacity = data.length * 2;
Item[] newData = (Item[]) new Object[capacity];
for (int i = 0; i < data.length; i++)
newData[i] = data[i];
data = newData;
}
public boolean add(Item x) {
if (size == data.length)
expandArray();
data[size++] = x;
return true;
}
// return an Iterator for the bag
public Iterator<Item> iterator() {
return new BagIterator<Item>();
}
// Iterator class
public class BagIterator<Item> implements Iterator<Item> {
private int i = 0;
public boolean hasNext() {
return i < size;
}
public Item next() {
return (Item) data[i++];
}
}
public boolean contains(Item x) {
for (int i = 0; i < data.length; i++) {
if (data[i] == x)
return true;
}
return false;
}
public boolean addUnique(Item x) {
for (int i = 0; i < data.length; i++) {
if (data[i] == x)
return false;
}
this.size++;
this.add(x);
return true;
}
public boolean remove(Item x) {
Item lastItem = x; // holds x item
Item swap; // holds item to swap
int swapIndex; // holds index of item to swap
for (int i = 0; i < data.length; i++) {
if (data[i] == x) {
// Save the last item
lastItem = data[3];
// Save the swapped item
swap = data[i];
// Save the index of swapped item
swapIndex = i;
// move swap item to end of list
data[3] = swap;
// move last item to swap pos
data[swapIndex] = lastItem;
// remove last item in list
this.size--;
return true;
}
}
return false;
}
public boolean equals(Object o) {
Bag<Item> b = (Bag<Item>) o;
return false;
}
}
我的想法背后的删除方法如下;穿过袋子,找到要移除的物品,拿起同样的物品并移动到袋子的末端(与袋子中的最后一个物品交换位置),然后减小袋子的尺寸(认为它会移除它)。
现在很清楚,我的思维存在一些问题。 1)包仍然是它的原始大小。 2)袋子现在是无序的,这将在比较两个袋子时导致问题。
所以我的问题是,我怎样才能有效地编写一个删除方法,从我的包类中取出一个项目,而不会遇到前面提到的问题。
主要
public class Main {
public static void main (String[] args) {
Bag<Integer> bag = new Bag<>();
bag.add(1);
bag.add(2);
bag.add(3);
bag.add(4);
System.out.println(bag); // [1, 2, 3, 4]
System.out.println(bag.remove(4)); // should remove 4 and return true **WORKING
System.out.println(bag.remove(1)); // should remove 1 and return true **WORKING
System.out.println(bag.remove(1)); // should NOT remove 1 and return false **NOT WORKING
System.out.println(bag); // [4 ]
}
}
我在代码的最底部添加了一个equals方法,这是我打算添加的东西。我应该补充一点,我需要在数据结构类中向我提供的现有代码实现最后4个方法(包含,addUnique,remove,equals)(所以我不能改变任何给我的东西)。很高兴听到我的第一个担忧不应该是one.I将添加更多的代码片段,以具体显示我正在遇到什么。感谢您花时间完成所有这些工作! – 23k
您的'.equals()'方法出于几个原因是有问题的。最重要的是'.equals()'被破坏,除非'.hashcode()'也以相同的方式实现(即如果'a.equals(b)'然后'a.hashcode()'必须等于'b.hashcode ()'),但它也比默认的Object.equals()实现更差,如果你试图比较同一个对象('a.equals(a)'),它至少会返回'true' ) - 你的实现将返回false,这是不正确的。 – dimo414
'.equals()'方法仍在我的待办事项列表中,我知道该实现当前不正确,现在我要求您忽略该方法。我在main中添加了更多的代码示例。基本上,如果物品不在包中,则remove应该返回false,但是,在同一个物品上调用remove两次会提供不正确的结果,这最初导致我相信该物品实际上并未被移除,只是隐藏起来。 – 23k