2016-04-07 8 views
-1

私はjavaで新しいです。私は言語を教えながらいくつかのテストをしようとしています。今私はリンクされたリストの実装です。テストサンプルのコードをオンラインでチャックしました。 LinkedListとLinkedListIteratorの2つのファイルがあります。私は実装を正しく理解しています。しかし、私はLinkedListクラスへのメソッドに追加したいと思います。 1つのメソッド(getString())は、リンクされたリスト内のすべての文字列変数の連結を表示するために使用されます。 2番目のメソッドgetSize()は、リストのサイズを表示するために使用されます。リンクされたリストの現在のインスタンスを取得することができないので、文字列とサイズを反復して取得できます。誰かが助けてくれますか?ヘルプは本当に感謝します。 2つのファイルは以下の通りです:JavaでLinkedListインスタンスを取得

import java.util.NoSuchElementException; 

public class LinkedList 
{ 
    //nested class to represent a node 
    private class Node 
    { 
      public Object data; 
      public Node next; 
    } 

    //only instance variable that points to the first node. 
    private Node first; 

    // Constructs an empty linked list. 
    public LinkedList() 
    { 
     first = null; 
    } 


    // Returns the first element in the linked list. 
    public Object getFirst() 
    { 
     if (first == null) 
     { 
     NoSuchElementException ex 
      = new NoSuchElementException(); 
     throw ex; 
     } 
     else 
     return first.data; 
    } 

    // Removes the first element in the linked list. 
    public Object removeFirst() 
    { 
     if (first == null) 
     { 
     NoSuchElementException ex = new NoSuchElementException(); 
     throw ex; 
     } 
     else 
     { 
     Object element = first.data; 
     first = first.next; //change the reference since it's removed. 
     return element; 
     } 
    } 

    // Adds an element to the front of the linked list. 
    public void addFirst(Object element) 
    { 
     //create a new node 
     Node newNode = new Node(); 
     newNode.data = element; 
     newNode.next = first; 
     //change the first reference to the new node. 
     first = newNode; 
    } 

    // Returns an iterator for iterating through this list. 
    public ListIterator listIterator() 
    { 
     return new LinkedListIterator(); 
    } 


    public String toString(){ 

     } 

     public int getSize(){ 
      return this.size(); 
     } 

    //nested class to define its iterator 
    private class LinkedListIterator implements ListIterator 
    { 
     private Node position; //current position 
     private Node previous; //it is used for remove() method 

     // Constructs an iterator that points to the front 
     // of the linked list. 

     public LinkedListIterator() 
     { 
     position = null; 
     previous = null; 
     } 

    // Tests if there is an element after the iterator position. 
    public boolean hasNext() 
     { 
     if (position == null) //not traversed yet 
      { 
      if (first != null) 
       return true; 
      else 
       return false; 
      } 
     else 
      { 
       if (position.next != null) 
       return true; 
       else 
       return false; 
      } 
     } 

     // Moves the iterator past the next element, and returns 
     // the traversed element's data. 
     public Object next() 
     { 
     if (!hasNext()) 
      { 
      NoSuchElementException ex = new NoSuchElementException(); 
      throw ex; 
      } 
     else 
      { 
      previous = position; // Remember for remove 

      if (position == null) 
       position = first; 
      else 
       position = position.next; 

      return position.data; 
      } 
     } 

     // Adds an element before the iterator position 
     // and moves the iterator past the inserted element. 
     public void add(Object element) 
     { 
     if (position == null) //never traversed yet 
     { 
      addFirst(element); 
      position = first; 
     } 
     else 
     { 
      //making a new node to add 
      Node newNode = new Node(); 
      newNode.data = element; 
      newNode.next = position.next; 
      //change the link to insert the new node 
      position.next = newNode; 
      //move the position forward to the new node 
      position = newNode; 
     } 
     //this means that we cannot call remove() right after add() 
     previous = position; 
     } 

     // Removes the last traversed element. This method may 
     // only be called after a call to the next() method. 
     public void remove() 
     { 
     if (previous == position) //not after next() is called 
      { 
      IllegalStateException ex = new IllegalStateException(); 
      throw ex; 
      } 
     else 
      { 
      if (position == first) 
      { 
       removeFirst(); 
      } 
      else 
      { 
       previous.next = position.next; //removing 
      } 
      //stepping back 
      //this also means that remove() cannot be called twice in a row. 
      position = previous; 
     } 
     } 

     // Sets the last traversed element to a different value. 
     public void set(Object element) 
     { 
     if (position == null) 
      { 
      NoSuchElementException ex = new NoSuchElementException(); 
      throw ex; 
      } 
     else 
      position.data = element; 
     } 

    } //end of LinkedListIterator class 
} 

LinkedListIteratorクラス:

public interface ListIterator 
{ 
    //Move Moves the iterator past the next element. 
    Object next(); 

    // Tests if there is an element after the iterator position. 
    boolean hasNext(); 

    // Adds an element before the iterator position 
    // and moves the iterator past the inserted element. 
    void add(Object element); 


    // Removes the last traversed element. This method may 
    // only be called after a call to the next() method. 
    void remove(); 

    // Sets the last traversed element to a different value. 
    void set(Object element); 
} 

エラー私はのgetSize()のimplmentationしようとすると:

Exception in thread "main" java.lang.StackOverflowError 
    at assignment10.LinkedList.size(LinkedList.java:84) 
    at assignment10.LinkedList.size(LinkedList.java:84) 
    at assignment10.LinkedList.size(LinkedList.java:84) 
    at assignment10.LinkedList.size(LinkedList.java:84) 
+0

に各項目を追加し、あなたは何を試してみましたか?メソッドは空です。現在のインスタンスはキーワード '' this''で参照できます。しかし、私はそれがここの問題だとは思わない。イテレータを使用して値を1つずつ取得します。 – f1sh

+0

あなたは 'LinkedList'であなたのクラスメンバーとして' int size'を持つことができますし、それぞれ 'add'や' remove'メソッドでそれを増減することができます。 文字列表現では、イテレータを作成し、ノードをフォーマットするためにすべてのノードを反復処理する必要があります。 より良い実装のためにJavaのLinkedListを参照してください。https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html –

+0

既存のLinkedListを単純に拡張するのはなぜですか?既にsize()メソッドがあるので、getSize()でラップするだけで、内部でStringを使用するだけで簡単にtoString()メソッドをオーバーライドできます – Akceptor

答えて

0

getSize()は可能性を

public int getSize(){ 
    int size = 0; 
    ListIterator iterator = listIterator(); 
    while(iterator.hasNext()) { 
     iterator.next(); 
     size++; 
    } 

    return size; 
} 

しかし、それを知るためには、毎回リストを繰り返し処理するのは効率的ではありません。より良い解決策は、クラス変数としてサイズを格納し、リストを変更するメソッドを増減することです。

toString()方法の考え方は同じですが、リストを反復処理し、結果の文字列

public String toString(){ 
    StringBuilder sb = new StringBuilder(); 
    ListIterator iterator = listIterator(); 
    while(iterator.hasNext()) { 
     sb.append(String.valueOf(iterator.next())).append(","); 
    } 

    return sb.toString; 
} 
関連する問題