わかりました、それで私はリンクされたリストを印刷する方法を学ぼうとしています。リストに使用する必要のあるすべてのメソッドがありますが、ノードの値を表示する方法がわかりません。現在、メインで静的でないメソッドを呼び出そうとしてエラーが発生し続けているため、メインメソッドには何もありません。リストの内容を表示するtoStringメソッドがあります。各ノードの値を表示するために、このtoStringをどのように呼び出しますか?どんなアドバイスでも大歓迎です。
これがノードクラスです:
public class LinkedListNode
{
private int data;
private LinkedListNode next;
public LinkedListNode(int data)
{
this.data = data;
this.next = null;
}
public int getData()
{
return data;
}
public void setData(int d)
{
data = d;
}
public LinkedListNode getNext()
{
return next;
}
public void setNext(LinkedListNode n)
{
next = n;
}
}
リストを操作するためのメインとメソッドを含むLinkedListクラスは次のとおりです。
public class LinkedList {
public LinkedListNode head;
public static void main(String[] args) {
LinkedList l = new LinkedList();
l.insertFront(0);
System.out.println(l.toString());
}
public LinkedList() {
this.head = null;
}
public int removeFront(){
if(head == null){
System.out.println("Error - Attempting to call removeFront() on empty list");
return 0;
}else{
int temp = head.getData();
head = head.getNext();
return temp;
}
}
public void insertFront(int data){
if(head == null){
head = new LinkedListNode(data);
}else{
LinkedListNode newNode = new LinkedListNode(data);
newNode.setNext(head);
head = newNode;
}
}
public void insertBack(int data){
if(head == null){
head = new LinkedListNode(data);
}else{
LinkedListNode newNode = new LinkedListNode(data);
LinkedListNode current = head;
while(current.getNext() != null){
current = current.getNext();
}
current.setNext(newNode);
}
}
public int removeBack(){
if(head == null){
System.out.println("Error - Attempting to call removeBack() on empty list");
return 0;
}else if (head.getNext() == null){
int temp = head.getData();
head = null;
return temp;
}else{
LinkedListNode current = head;
while(current.getNext().getNext() != null){
current = current.getNext();
}
int temp = current.getNext().getData();
current.setNext(null);
return temp;
}
}
public String toString(){
String retStr = "Contents:\n";
LinkedListNode current = head;
while(current != null){
retStr += current.getData() + "\n";
current = current.getNext();
}
return retStr;
}
public LinkedListNode getHead() {
return head;
}
public void setHead(LinkedListNode head) {
this.head = head;
}
}
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.insertFront(1);
list.insertFront(2);
list.insertFront(3);
System.out.println(list.toString());
}
String toString() {
String result = "";
LinkedListNode current = head;
while(current.getNext() != null){
result += current.getData();
if(current.getNext() != null){
result += ", ";
}
current = current.getNext();
}
return "List: " + result;
}
他のいくつかの回答やコメントで指摘されているように、ここで欠落しているのは、toString()メソッドによって生成された文字列を出力するためのJVMシステムクラスの呼び出しです。
LinkedList myLinkedList = new LinkedList();
System.out.println(myLinkedList.toString());
これで仕事は終わりますが、そのようにすることはお勧めしません。 Objectクラスのjavadocsを見てみると、toString()について次の説明があります。
オブジェクトの文字列表現を返します。一般に、toStringメソッドは、このオブジェクトを「テキストで表す」文字列を返します。 結果は、簡潔でありながら有益な表現である必要があります。これは、人が読みやすいものです。すべてのサブクラスでこのメソッドをオーバーライドすることをお勧めします。
そこに付け加えられた強調は私自身です。リンクリストの状態全体を含む文字列を作成していますが、クラスを使用している誰かがおそらく予期していません。次の変更をお勧めします。
LinkedListNode内:
public String toString(){
return "LinkedListNode with data: " + getData();
}
LinkedList内:
public int size(){
int currentSize = 0;
LinkedListNode current = head;
while(current != null){
currentSize = currentSize + 1;
current = current.getNext();
}
return currentSize;
}
public String toString(){
return "LinkedList with " + size() + "elements.";
}
public void printList(){
System.out.println("Contents of " + toString());
LinkedListNode current = head;
while(current != null){
System.out.println(current.toString());
current = current.getNext();
}
}
JVM
がアプリケーションを実行しようとすると、mainメソッドが静的に呼び出されます。このようなもの:
_LinkedList.main();
_
つまり、LinkedList
クラスのインスタンスはありません。 toString()
メソッドを呼び出すために、LinkedList
クラスの新しいインスタンスを作成できます。
したがって、main
メソッドの本体は次のようになります。
_public static void main(String[] args){
// creating an instance of LinkedList class
LinkedList ll = new LinkedList();
// adding some data to the list
ll.insertFront(1);
ll.insertFront(2);
ll.insertFront(3);
ll.insertBack(4);
System.out.println(ll.toString());
}
_
非常に簡単な解決策は、override
のtoString()
メソッドをNode
することです。次に、LinkedList
のhead
を渡して、printを呼び出すことができます。ループの種類を実装する必要はありません。
コード:
public class LinkedListNode {
...
//New
@Override
public String toString() {
return String.format("Node(%d, next = %s)", data, next);
}
}
public class LinkedList {
public static void main(String[] args) {
LinkedList l = new LinkedList();
l.insertFront(0);
l.insertFront(1);
l.insertFront(2);
l.insertFront(3);
//New
System.out.println(l.head);
}
}
私はそれを次のようにしています:
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.insertFront(1);
list.insertFront(2);
list.insertFront(3);
System.out.println(list.toString());
}
String toString() {
StringBuilder result = new StringBuilder();
for(Object item:this) {
result.append(item.toString());
result.append("\n"); //optional
}
return result.toString();
}