2017-11-17 15 views
0

Javaでリンクリストを作成する際に問題が発生しています。私が従っているすべてのガイドでは、String型の変数を使って例を挙げていますが、作成するリストにはint型が必要です。 int型を使用すると、intを文字列に変換できないという理由でposition.linkのようなものを呼び出そうとするとエラーメッセージが表示されます。int/Stringリンクリストと変数に関する問題

わかりやすくするために、メインプログラムでは、スキャナがintを要求し、そのintを使用して各ノードを作成するループを作成する必要があります。私はイテレータと単なる単数のリンクリストを使いこなしましたが、私はどこにもいません。

import java.util.NoSuchElementException; 
public class SuitorLinkedList<Integer> 
{ 
    private class SuitorListNode 
    { 
     private int suitor; 
     private SuitorListNode link; 

     public SuitorListNode() 
     { 
     suitor = 0; 
     link = null; 
     } 

     public SuitorListNode(int newSuitor, SuitorListNode linkValue) 
     { 
     suitor = newSuitor; 
     link = linkValue; 
     } 
    } // End of SuitorListNode inner class 

    public class SuitorListIterator 
    { 
     public SuitorListNode position; 
     private SuitorListNode previous; // previous value of position 

     public SuitorListIterator() 
     { 
     position = head; // variable head of outer class 
     previous = null; 
     } 

     public void restart() 
     { 
     position = head; 
     previous = null; 
     } 

     public String next() 
     { 
     if(!hasNext()) 
      throw new NoSuchElementException(); 

     String toReturn = position.suitor; 
     previous = position; 
     position = position.link; 
     return toReturn; 
     } 

     public boolean hasNext() 
     { 
     return (position != null); // Throws IllegalStateExpression if false 
     } // Returns next value to be returned by next() 

     public String peak() 
     { 
     if(!hasNext()) 
      throw new IllegalStateException(); 
     return position.suitor; 
     } 

     public void addHere(int newData) 
     { 
     if(position == null && previous != null) // At end of list, add to end 
      previous.link = new SuitorListNode(newData, null); 
     else if(position == null || previous == null) // List empty or position is head node 
      head = new SuitorListNode(newData, head); 
     else // previous and position are consecutive nodes 
     { 
      SuitorListNode temp = new SuitorListNode(newData, position); 
      previous.link = temp; 
      previous = temp; 
     } 
     } 

     public void delete() 
     { 
     if(position == null) 
      throw new IllegalStateException(); 
     else if (previous == null) // remove node at head 
     { 
      head = head.link; 
      position = head; 
     } 
     else // previous and position are consecutive nodes 
     { 
      previous.link = position.link; 
      position = position.link; 
     } 
     } 

     private SuitorListNode head; 
    } 
    public SuitorListIterator iterator() 
    { 
     return new SuitorListIterator(); 
    } 
} 

は私がしようとするたびに、私はそれを検索し、支援するためにtoString()を使用して試した、このエラーが出るが、それは動作しません:私が作成しようとした

SuitorLinkedList.java:60: error: incompatible types: int cannot be converted to String 
     return position.suitor; 
         ^

通常のリンクリスト、これまでのところ得た:

public class SuitorList 
{ 
    public class SuitorNode 
    { 
     public int suitor; 
     public SuitorNode link; 

     public SuitorNode() 
     { 
     suitor = 0; 
     link = null; 
     } // Initialize veriables 

     public SuitorNode(int newSuitor, SuitorNode linkValue) 
     { 
     suitor = newSuitor; 
     link = linkValue; 
     } // Assigns values sent in from main 
    } // End inner class 

    private SuitorNode head; // Variable head of type SuitorNode (callback to Node program) 
    // Allows head to point to a node 

    public SuitorList() 
    { 
     head = null; 
    } // Initialize variables 
    // Memory space called head filled with null 

    public void addToStart(int suitorNum) 
    { 
     head = new SuitorNode(suitorNum, head); 
    } 

    // Creates node with head pointing to it at start of list 
    // head will have a definition as an object with a suitor and link = head 
    // If head = null, then link = null 
    // head is repositioned to point to node 

    public int size() // Reads size of list 
    { 
     int count = 0; 
     SuitorNode position = head; // Variable position of type SuitorNode will equal value at head; position points where head is pointing 
     while(position != null) // While list is not empty/ended 
     { 
     count++; // increase number of entries detected 
     position = position.link; // getLink will make position = link, leading to next entry in list 
     } 
     return count; // Display size. 
    } 

    public void outputList() 
    { 
     SuitorNode position = head; // Position points to same thing head points to 

     while(position != null) // While list is not empty/ended 
     { 
     System.out.println(position.suitor); // Print suitor 
     position = position.link; // Go to next entry 
     } 
    } 

    public void deleteNode(int count) 
    { 
     int moveCount = count - 1; 
     SuitorNode position = head; 

     while(head != link) // not winning 
     { 
     moveCount = count; 
     checkEnd(); // Checks for win before causing potential problem with 1 suitor left 
     checkTwoNumbersLeft(moveCount); // Takes care of movement when two nodes are left 
     checkEndNode(moveCount); // Checks when, for example, 2 nodes away 

     if(moveCount == count) // If checkEndNode and checkTwoNumbersLeft fail 
     { 
      position = position.link; // Move for first time 
      moveCount = moveCount - 1; 
     } 

     checkEnd(); 
     checkEndNode2(moveCount); // When one movement is made already, deletes end node after 

     if(moveCount == moveCount - 1) // if checkEndNode2 fails 
      position = position.link.link; // 2nd deletion 
     count = moveCount; 
     } 

     isWinner(); 
    } // End method deleteNode() 

    public void checkTwoNumbersLeft(int moveCount) 
    { 
     SuitorNode position; 
     if(position.link.link == null) // example: 1 5 
     { 
     createLoop(); 
     position = position.link.link; // Deletes the 5 
     moveCount = moveCount - 2; 
     } // Used just in case only two numbers are present 
    } // End method checkTwoNumbersLeft() 

    public void checkEnd() 
    { 
     SuitorNode position; 
     if(position.link == null) // If at end of list 
     { 
     createLoop(); // creates a loop if the initial number has no next value 
     isWinner(); // If a 1 is used, the entire if statement will trigger 
     } // if true, head == link which will fall out of while in deleteNode() 
    } // End method checkEnd() 

    public void isWinner() 
    { 
     SuitorNode link; 
     SuitorNode position; 
     if(position == position.link) 
     { 
     head = link; 
     System.out.println("The winner is Suitor " + position + "!"); 
     } 
    } // End method isWinner() 

    public void checkEndNode2(int moveCount) 
    { 
     SuitorNode position; 
     SuitorNode link; 

     if(position.link.link == null) // 1 movement 
     { 
     position.link = null; 
     createLoop(); 
     isWinner(); 
     moveCount = moveCount - 1; 
     } 
    } // End checkEndNode2() 

    public void checkEndNode(int moveCount) 
    { 
     SuitorNode position; 
     SuitorNode link; 

     if(position.link.link.link == null) // no movements 
     { 
     position = position.link; 
     position.link = null; 
     createLoop(); 
     isWinner(); 
     moveCount = moveCount - 2; 
     } 
    } // End checkEndNode() 

    public void createLoop() 
    { 
     SuitorNode position; 
     SuitorNode link; 

     if(link == null) // if at the end of the list 
     link = head; // Sets link to point to where head points, AKA beginning of list 
    } // End createLoop() 
} 

をしかし、私は、この変数を行う際リンク位置、 nd ヘッドは、メソッドの内部に配置しない限り、初期化されていないと言っています(リストの途中でメソッドを呼び出すとコードが壊れる可能性があります)。

私の質問は1)私はリンクリストを扱うためにintを文字列に変換することができますか? 2)なぜプログラム内の変数がありますかSuitorList私はいつでもどこにでも配置しようとしたときに、それらをすべてのインスタンスで再初期化する必要がありますか?

+1

私はリンクされたリストの非常に緩い理解を持って、私は私が出くわすほとんどの例の周りに私の頭を包むことができませんでした。 –

+2

エラーが発生したメソッドのシグネチャを 'public String peak()'から 'public int peak()'に変更すると、 'int'を返すようにしたいのでどうなりますか?おそらく 'next()'のシグネチャと 'next()'の中の 'toReturn'変数の宣言で同じことをしたいでしょう。 –

+0

私はそれが私の問題だったと信じています。私は私のメインプログラムを終えると、それが唯一のものであることを確かめなければなりません。 –

答えて

2

問題は、あなたのPEEK関数はそれが代わりにそれがsuitorの型として定義されなければならないString

を返すように定義されます

public String peak() 
{ 
    if(!hasNext()) 
     throw new IllegalStateException(); 
    return position.suitor; 
} 

間違った型として定義されてint

public int peak() 
{ 
    if(!hasNext()) 
     throw new IllegalStateException(); 
    return position.suitor; 
} 
です

public String next()と同じ問題は、代わりにpublic int next()

+0

ありがとう、私は最終的に私を台無しにするつもり文字列を使用していたガイドからの読書を知っていた。私の主な方法でこのような問題が発生した場合は、私はアップデートを行います。 –

0

変数補助者は、変数タイプintが与えられます。 にすることは可能です。それを変換することによって;

public String peak() { if(!hasNext()) throw new IllegalStateException(); return Integer.toString(position.suitor); } 

この方法では、このエラーを取り除く必要があります。またはString.valueOf(position.suitor);を使用します。

関連する問題