我需要编写一个返回数字的方法 - 在链表中找到元素的次数。到目前为止,我有;
package Question4;
import net.datastructures.Node;
public class SLinkedListExtended<E> extends SLinkedList<E> {
// returns the number of occurrences of the given element in the list
public int count(E elem) {
Node<E> cursor = tail;
int counter = 0;
if ((cursor != null) && (!(cursor.getElement().equals(elem)))) { //tail isnt null and element is not equal to elem
cursor = cursor.getNext(); //go to next node
} else if ((cursor != null) && (cursor.getElement().equals(elem))){ //cursor isn't null and element equals elem
counter++; //increment counter
}
else {
return counter; //return counter
}
return counter;
}
public static void main(String[] args) {
SLinkedListExtended<String> x = new SLinkedListExtended<String>();
x.insertAtTail("abc");
x.insertAtTail("def");
x.insertAtTail("def");
x.insertAtTail("xyz");
System.out.println(x.count("def")); // should print "2"
x.insertAtTail(null);
x.insertAtTail("def");
x.insertAtTail(null);
System.out.println(x.count("def")); // should print "3"
System.out.println(x.count(null)); // should print "2"
}
}
我已经扩展到一个正确编译的类,所以我知道问题出在我的方法中。我无法弄清楚要做什么,我的代码返回0,这可能是计数器整数保持为0而不是通过循环语句。任何想法都表示赞赏。
修改。 SLinkedList代码:
import net.datastructures.Node;
public class SLinkedList<E> {
protected Node<E> head; // head node of the list
protected Node<E> tail; // tail node of the list (if needed)
protected long size; // number of nodes in the list (if needed)
// default constructor that creates an empty list
public SLinkedList() {
head = null;
tail = null;
size = 0;
}
// update and search methods
public void insertAtHead(E element) {
head = new Node<E>(element, head);
size++;
if (size == 1) {
tail = head;
}
}
public void insertAtTail(E element) {
Node<E> newNode = new Node<E>(element, null);
if (head != null) {
tail.setNext(newNode);
} else {
head = newNode;
}
tail = newNode;
size++;
}
public static void main(String[] args) { // test
SLinkedList<String> list = new SLinkedList<String>();
list.insertAtHead("lol");
}
}
答案 0 :(得分:0)
count
中的代码不在循环中,所以它只会在第一个元素之后返回。
试试这个:
public int count(E elem) {
Node<E> cursor = tail;
int counter = 0;
while (true)
{
if ((cursor != null) && (!(cursor.getElement().equals(elem)))) { //tail isnt null and element is not equal to elem
cursor = cursor.getNext(); //go to next node
} else if ((cursor != null) && (cursor.getElement().equals(elem))){ //cursor isn't null and element equals elem
counter++; //increment counter
}
else {
return counter; //return counter
}
}
}
另请注意,当cursor.getElement().equals(elem)
为NullPointerException
时,cursor.getElement()
将返回null
。解决这个问题的最简单方法可能是编写一个单独的equals方法:
boolean equals(E e1, E e2)
{
if (e1 == null)
return e2 == null;
if (e2 == null)
return false;
return e1.equals(e2);
}
此外,大概Node<E> cursor = tail;
使其指向列表的末尾,并且可能是您想要Node<E> cursor = head;
。
答案 1 :(得分:0)
也许你应该使用while循环而不是if子句
**while** ((cursor != null) && (!(cursor.getElement().equals(elem)))) {
答案 2 :(得分:0)
你缺少的一个基本问题是循环。由于您实际上是在搜索某些内容,因此您希望遍历整个列表。一旦遇到与您要搜索的元素匹配的元素,您希望将计数增加1.一旦完成整个列表的循环,就要返回该计数。所以这是我的解决方案。我保持简单,所以你可以理解:
import java.util.LinkedList;
public class Duplicates<E> extends LinkedList<E> {
public static void main(String[] args) {
Duplicates<String> duplicates = new Duplicates<String>();
duplicates.add("abc");
duplicates.add("def");
duplicates.add("def");
duplicates.add("xyz");
System.out.println(duplicates.duplicateCount("def"));
duplicates.add(null);
duplicates.add("def");
duplicates.add(null);
System.out.println(duplicates.duplicateCount("def"));
System.out.println(duplicates.duplicateCount(null));
}
public int duplicateCount(E element) {
int count = 0;
for (E e : this) {
if (e == element) {
count++;
}
}
return count;
}
}
输出:
2
3
2
答案 3 :(得分:0)
我建议你将Martin的答案(告诉你如何计算元素)与它结合起来,告诉你如何能够使用foreach - 你只需要制作SLinkedListExtended
工具Iterable
,whioch应该是下面的东西(你可以在SLinkedList
上做,但我假设你被告知不要改变那个代码):
public class SLinkedListExtended<E> extends SLinkedList<E> implements Iterable<E> () {
public Iterator<E> iterator() {
final Node<E> itHead = head;
return new Iterator<E>() {
Node<E> current = itHead;
long position = 0;
public boolean hasNext() {
return current != null && position < size;
}
public E next() {
current = current.getNext();
++position;
return current.getElement();
}
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
};
}
};
我无法保证所有细节,但这应该涵盖大部分细节。您也可以考虑使用equals
代替==
,但不要忘记检查元素是否为无效。
next
为hasNext
时才应调用{p> true
,因此如果它引发异常(但NoSuchElementException
应保持一致,则不会出现问题与合同)。
实现Iterable
使您的类与Collections库兼容,因此支持foreach,但您可以通过调用iterator
,hasNext
和{{1来使用它来执行原始迭代你自己。