我正在将此作为我的Java课程的额外练习,但我似乎无法理解为什么我的添加方法无法正常工作。我已尝试逐行使用调试器遍历代码,但我无法查看它出错的地方。这显然是一个逻辑错误。当我测试add方法时,它似乎工作但它没有正确地链接节点,或者不存储数据。
所以赋值是写一个链表(不添加重复项)。我将Node类作为LinkedSet类的内部函数。我们的教科书建议针对这一特定任务。 这是我使用的添加方法。
public class LinkedSet <T> implements SetInterface <T> {
private Node firstNode;
private int numberOfEntries;
public LinkedSet (){
firstNode = null;
numberOfEntries = 0;
}
public boolean add(T newEntry){
boolean result = false;
Node aNewNode = new Node (newEntry);
//If Node is currently null then add data to front
if(firstNode == null)
firstNode = aNewNode;
else
{
//Add newEntry if it's not already stored.
if(!contains(newEntry) && numberOfEntries != 0)
{
aNewNode.next = firstNode;
firstNode.next = aNewNode;
firstNode = aNewNode;
result = true;
}
else
result = false;
}
return result;
}//End add
public boolean contains(T anEntry){
boolean found = false;
while (!found && (firstNode != null))
{
if(anEntry.equals(firstNode.getData()))
found = true;
else
firstNode = firstNode.getNextNode();
}
return found;
}
private class Node {
private T data;
private Node next;
private Node (T theData){
data = theData;
next = null;
}
private Node(T theData, Node nextNode){
data = theData;
next = nextNode;
}
} //End Node class
}End LinkedSet
此外,这是添加的测试方法(需要编写单独的测试应用程序并在单独的主类中完成)
private static boolean testAdd(SetInterface<String> aSet, String[] contentsToAdd){
boolean result = false;
for (int index = 0; index < contentsToAdd.length; index++)
{
aSet.add(contentsToAdd[index]);
result = true;
}
return result;
}//End testAdd
还有一些其他的方法,但在我可以使用add方法之前,我不能对它们做很多事情,所以我很确定这个问题就在这里。 我在类似的问题上环顾网络,但我仍然无法看到它在哪里。感谢任何帮助,我现在已经把它弄得太久了。
答案 0 :(得分:2)
if(firstNode == null)
firstNode = aNewNode;
在这种情况下,您应该返回true
。
if(!contains(newEntry) && numberOfEntries != 0)
这个测试没有多大意义。反过来会更有意义:
if(numberOfEntries != 0 && !contains(newEntry))
因为如果没有条目,调用contains()
是没有意义的,但是contains()
已经知道无论如何,firstNode
如果numberOfEntries
为零则为空,所以它应该只是
if (!contains(newEntry))
注意:您没有维护numberOfEntries
。
答案 1 :(得分:1)
我没有彻底阅读你的所有代码,但这里有一个错误:
if(firstNode == null)
firstNode = aNewNode;
它应该增加numberOfEntries
。
因为numberOfEntries
始终为零且添加无法正常工作
同样,您也不会在numberOfEntries
中维护else
。
答案 2 :(得分:0)
包含方法也有问题,您正在更改firstNode引用,您不应该更改
public boolean contains(T anEntry){
boolean found = false;
Node ptr = firstNode;
while (!found && (ptr != null))
{
if(anEntry.equals(ptr.getData()))
found = true;
else
ptr = ptr.getNextNode();
}
return found;
}