这是我的代码:
public class RecipeBook {
private class Node {
private Recipe mData;
private Node mNext;
private Node mPrev;
public Node(Recipe data, Node next, Node prev) {
mData = data;
mNext = next;
mPrev = prev;
}
}
private Node mHead;
private Node mTail;
private int mCount;
public RecipeBook() {
}
public void add(Recipe itemToAdd) {
Node newNode = new Node(itemToAdd, null, null);
if (mHead == null)
mHead = mTail = newNode;
else {
mTail.mNext = newNode;
newNode.mPrev = mTail;
mTail = newNode;
}
mCount++;
}
public int getCount() {
return mCount;
}
public Recipe get(int index) {
Node n = mHead;
for (int i = 0; i < index; i++) {
if (n == null)
return null;
n = n.mNext;
}
return n != null ? n.mData : null;
}
public boolean remove(Recipe itemToRemove) {
Node n = mHead;
boolean check = false;
if (n == null) {
check = false;
return check;
}
while (n != null) {
if (n.mData == itemToRemove) {
if (n == mHead) {
mHead = mHead.mNext;
mHead.mPrev = null;
}
else if (n == mTail) {
mTail = mTail.mPrev;
mTail.mNext = null;
}
else {
Node prev = n.mPrev;
Node next = n.mNext;
prev.mNext = next;
next.mPrev = prev;
}
check = true;
mCount--;
return check;
}
else {
n = n.mNext;
}
}
return check;
}
public Recipe searchByName(String name) {
for (int i = 0; i < this.getCount(); i++) {
if (this.get(i).getName().equals(name))
return this.get(i);
}
return null;
}
public Recipe searchByIngredients(String target) {
for (int i = 0; i < this.getCount(); i++) {
if (this.get(i).hasIngredients(target) == true)
return this.get(i);
}
return null;
}
}
我的问题是使用remove方法,我实际上已经使用调试器进行了检查。 while循环工作正常,程序在n.mData == itemToRemove
时通过if语句。无论项目在列表中的哪个位置,它都会删除它要删除的内容。另外,mCount变小了一个,并且检查变为true,但是一旦它返回它就不会返回任何东西。相反,它会返回循环,并继续前进,直到n为空。如果检查仍然为真,那就没问题,但是在它退出if语句而没有返回任何内容之后,它会将检查恢复为false,然后使整个方法返回false。我已经尝试删除返回和休息,这给了我相同的结果。我还尝试在运行调试器时没有返回或中断,这表明它保留在if语句中,就好像该语句是循环一样。
答案 0 :(得分:0)
这是一个临时解决方案,但尝试在break
之后添加n.mData == itemToRemove
,然后返回check
。这应该可以为您提供一些提示,或许为您的代码无法正常工作。
public boolean remove(Recipe itemToRemove) {
Node n = mHead;
boolean check = false;
if (n == null) {
check = false;
return check;
}
while (n != null) {
if (n.mData == itemToRemove) {
if (n == mHead) {
mHead = mHead.mNext;
mHead.mPrev = null;
}
else if (n == mTail) {
mTail = mTail.mPrev;
mTail.mNext = null;
}
else {
Node prev = n.mPrev;
Node next = n.mNext;
prev.mNext = next;
next.mPrev = prev;
}
check = true;
mCount--;
break;
}
else {
n = n.mNext;
}
}
return check;
}