LinkedList - 循环不工作 - Java

时间:2013-02-24 00:54:51

标签: java linked-list counter extend

我需要编写一个返回数字的方法 - 在链表中找到元素的次数。到目前为止,我有;

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");

}

}

4 个答案:

答案 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代替==,但不要忘记检查元素是否为无效。

仅当nexthasNext时才应调用{p> true,因此如果它引发异常(但NoSuchElementException应保持一致,则不会出现问题与合同)。

实现Iterable使您的类与Collections库兼容,因此支持foreach,但您可以通过调用iteratorhasNext和{{1来使用它来执行原始迭代你自己。