我很难搞清楚我的代码有什么问题。我想删除包含特定项目的所有节点。在我的代码下面的测试代码中,它要求我删除句子“to be or not to be”中的所有项目,然后返回头部,在这种情况下是“be”。有人可以用我的代码指出问题吗?谢谢。
package edu.csc130.assignment;
import java.util.LinkedList;
public class ListStackQueue {
/**
* @param head the head of the input linked list
* @param item the given value
* @return the head of the linked list with nodes contains the given value removed
* Assume for any node in the linked list, node.item cannot be null
*/
public static Node<String> removeNodes(Node<String> head, String item) {
Node<String> curr = head;
Node<String> prev = null;
if (head == null) {
System.out.println("list is empty");
} else {
while (curr != null) {
if (curr.data != item) {
prev = curr;
curr = curr.next;
} else if (curr == head && curr.data == item) {
head = head.next;
curr = curr.next;
} else if (curr != head && curr.next != null && curr.data == item) {
prev.next = curr.next;
curr = curr.next;
} else {
curr.next = null;
}
}
}
return head;
}
}
BuildList代码的一部分&lt; - 我道歉,我没有提出这部分代码。感谢那些迄今为止帮助过我的人。
/**
* @param items input array
* @return the first node of the linked list build from the input array
*/
public static <E> Node<E> buildList(E[] items) {
Node<E> head = null;
if (items!=null && items.length>0) {
head = new Node<E> (items[0], null);
Node<E> tail = head;
for (int i=1; i<items.length; i++) {
tail.next = new Node<E>(items[i], null);
tail = tail.next;
}
}
return head;
}
/**
* @param head the first node of the linked list
* @return the length of the linked list
*/
public static <E> int getLength(Node<E> head) {
int length = 0;
Node<E> node = head;
while (node!=null) {
length++;
node = node.next;
}
return length;
}
public static <E> E get(Node<E> head, int index) {
E item = null;
Node<E> node = head;
for (int i=0; i<index; i++) {
if (node != null) {
node = node.next;
} else {
break;
}
}
if (node!=null) {
item = node.item;
}
return item;
}
public static class Node<E> {
public Object data;
public String data();
E item;
Node<E> next;
public Node(E item) {
this.item = item;
this.next = null;
}
public Node(E item, Node<E> next) {
this.item = item;
this.next = next;
}
}
测试代码:
package edu.csc130.assignment;
import org.junit.Assert;
import org.junit.Test;
import edu.csc130.assignment.ListStackQueue.Node;
public class ListStackQueueTest {
@Test
public void testRemoveNodes1() {
Node<String> head = ListStackQueue.buildList(null);
ListStackQueue.removeNodes(head, "to");
Assert.assertNull(head);
}
@Test
public void testRemoveNodes2() {
String[] sentence = {"to", "be", "or", "not", "to", "be"};
Node<String> head = ListStackQueue.buildList(sentence);
head = ListStackQueue.removeNodes(head, "to");
Assert.assertEquals(4, ListStackQueue.getLength(head));
Assert.assertEquals("be", ListStackQueue.get(head, 0));
Assert.assertEquals("or", ListStackQueue.get(head, 1));
Assert.assertEquals("not", ListStackQueue.get(head, 2));
Assert.assertEquals("be", ListStackQueue.get(head, 3));
}
@Test
public void testRemoveNodes3() {
String[] sentence = {"to", "be", "or", "not", "to", "be"};
Node<String> head = ListStackQueue.buildList(sentence);
head = ListStackQueue.removeNodes(head, "be");
Assert.assertEquals(4, ListStackQueue.getLength(head));
Assert.assertEquals("to", ListStackQueue.get(head, 0));
Assert.assertEquals("or", ListStackQueue.get(head, 1));
Assert.assertEquals("not", ListStackQueue.get(head, 2));
Assert.assertEquals("to", ListStackQueue.get(head, 3));
}
@Test
public void testRemoveNodes4() {
String[] sentence = {"to", "be", "or", "not", "to", "be"};
Node<String> head = ListStackQueue.buildList(sentence);
head = ListStackQueue.removeNodes(head, "or");
Assert.assertEquals(5, ListStackQueue.getLength(head));
Assert.assertEquals("to", ListStackQueue.get(head, 0));
Assert.assertEquals("be", ListStackQueue.get(head, 1));
Assert.assertEquals("not", ListStackQueue.get(head, 2));
Assert.assertEquals("to", ListStackQueue.get(head, 3));
Assert.assertEquals("be", ListStackQueue.get(head, 4));
}
}
这是我在使用JUnit测试在Eclipse中运行代码时遇到的错误。这是testRemoveNodes2测试的错误。 testRemoveNodes1测试没有错误。
java.lang.AssertionError: expected:<4> but was:<6>
答案 0 :(得分:1)
我认为您的计划不起作用的唯一方法是,使用curr.data
和item
的{{1}}和==
的比较无法按预期工作。这是完全可能的,因为不建议使用这些运算符比较字符串,这不是常见的做法,除非你真的知道你正在做什么(优化),否则它们将无法达到你的预期。
例如,如果在!=
的实施中,则使用ListStackQueue.buildList
创建节点data
字段的值。如果以这种方式创建值,那么new String(...)
对于两个字符串永远不会成立,即使它们的值相同。
最重要的是,不要使用s1 == s2
和==
比较字符串,
重写您的实现以使用!=
代替,
然后它应该工作。
当然,当你这样做时,在对象上调用.equals
之前,你需要首先验证它不是null,否则你将获得.equals
。
假设没有NullPointerException
字段为data
的节点,这应该有效:
null
我也放弃了一些多余的条件。
如果您想允许if (head == null) {
System.out.println("list is empty");
} else {
while (curr != null) {
if (!curr.data.equals(item)) {
prev = curr;
curr = curr.next;
} else if (curr == head) {
head = head.next;
curr = curr.next;
} else if (curr != head && curr.next != null) {
prev.next = curr.next;
curr = curr.next;
} else {
curr.next = null;
}
}
}
return head;
的{{1}}值,
然后上面的null
会更复杂一点,
将其替换为:
Node.data