嘿,伙计们,我写了这个deleteNode()方法,如果我使用数字(int),但不当我试图传递一个字符串。我正在打印一个String[]列表,我试图从列表中删除一个特定的名字。当我输入一个名称时,它打印"Node not found"。就像我说的,如果我打印出一个数字列表,它工作得很好,但如果我改变并打印一个字符串,它不会。任何帮助都是感激的。
public class BigNode {
public String dataitems;
public BigNode next;
BigNode front ;
public void initList(){
front = null;
}
public BigNode makeNode(String number){
BigNode newNode;
newNode = new BigNode();
newNode.dataitems = number;
newNode.next = null;
return newNode;
}
public boolean isListEmpty(BigNode front){
boolean balance;
if (front == null){
balance = true;
}
else {
balance = false;
}
return balance;
}
public BigNode findTail(BigNode front) {
BigNode current;
current = front;
while(current.next != null){
//System.out.print(current.dataitems);
current = current.next;
} //System.out.println(current.dataitems);
return current;
}
public void addNode(BigNode front ,String number){
BigNode tail;
if(isListEmpty(front)){
this.front = makeNode(number);
}
else {
tail = findTail(front);
tail.next = makeNode(number);
}
}
public void deleteNode(BigNode front, String value) {
BigNode curr, previous = null; boolean found;
if (!isListEmpty(front)){
curr = front;
found = false;
while ((curr.next != null) && (!found)) {
if(curr.dataitems.equals(value)) {
found = true;
}
else {
previous = curr;
curr = curr.next;
}
}
if (!found) {
if(curr.dataitems.equals(value)) {
found = true;
}
}
if (found) {
if (curr.dataitems.equals(front.dataitems)){ // front.dataitems may be wrong .dataitems
front = curr.next;
} else {
previous.next = curr.next;
}
} else {
System.out.println("Node not found!");
//curr.next = null; // Not sure If this is needed
}
}
showList(front);
}
public void printNodes(String[] len){
int j;
for (j = 0; j < len.length; j++){
addNode(front, len[j]);
} showList(front);
}
public void showList(BigNode front){
BigNode current;
current = front;
while ( current.next != null){
System.out.print(current.dataitems + ", ");
current = current.next;
}
System.out.println(current.dataitems);
}
public static void main(String[] args) {
String[] names = {"Billy Joe", "Sally Mae", "Joe Blow", "Tasha Blue"};
BigNode x = new BigNode();
x.printNodes(names);
Scanner in = new Scanner(System.in);
String delete = in.next();
x.deleteNode(x.front, delete);
}
String[] names = {name1, name2, name3, nam4}
-首先打印列表,然后询问要删除的名称。
编辑:好的,我已经发现你发布的示例代码有什么问题了。
您正在呼叫Scanner.next()
,它读取单个单词。所有的节点值都是两个字。所以如果我输入"Sally Mae"它实际上是只是寻找"Sally"。
这与BigNode
中的大部分代码无关(尽管这当然可以做得更优雅)。基本上是这样的:
String delete = in.next();
应该String delete = in.nextLine();
现在我强烈建议你不要只是修改代码,而是考虑一下你可以自己诊断这个问题的方法:
- 在代码中添加日志记录,以显示您正在寻找的值,以及您测试过的每个值
- 使用调试器逐步执行代码,观察变量
- 使用单元测试来测试代码——这些测试不会显示出问题(因为它不在您通常编写测试的代码中),但它们会给您更大的信心,使问题不在测试代码中。
如果你尝试了这些方法中的一些或最好是所有,你将从这个问题中学到的不仅仅是如何使用Scanner
…
在不同的地方,通过使用==操作符比较字符串引用。只有在传递对列表中存在的实际字符串对象之一的引用时,才会找到您的节点-而不是对相等的字符串对象的引用。
你想要这样的:
if (curr.dataitems.equals(value))
(但仔细检查null
)。
您应该使用String。==比较,而不是==比较,.
if(curr.dataitems == value) {
应:if(curr.dataitems.equals(value) {
与==
进行比较。对于int
,这比较值,但对于String
,这只比较引用。所以如果你想删除具有相同值但在不同对象中的字符串,这将失败。
用String.equals()
代替
您应该始终使用equals()来比较对象值,而不是==。例如,在代码中这一行:
curr.dataitems == value
应该写成:
curr.dataitems.equals(value)