簡體   English   中英

為什么我在Java代碼中得到此輸出?

[英]Why I am getting this output in my Java code?

The student at the top of the stack is Gullion,Hailey

Student Mcglothlen,Shizue is removed from the stack


Here are all the elements of the Stack using an Iterator
--------------------------------------------------------
Stack$Node@3012db7c
Stack$Node@2607c28c
Stack$Node@477588d5
Stack$Node@756a7c99
Stack$Node@221a5d08
Stack$Node@70d1c9b5
Stack$Node@5d11c3f0
Stack$Node@3956f14c
Stack$Node@7afbd1fc
null


Here are all the elements in the Stack
--------------------------------------
Putney,John
Larkey,Ismael
Winkler,Isiah
Aceto,Liana
Hamill,Crissy
Caraway,Elmira
Gullion,Hailey
Rodrigez,Jonie
Madruga,Terrell
Williams,Diego

使用迭代器的Stack的第一個元素列表顯然無法正常工作。 我不知道為什么。 這是我在Stack類中用於Iterator的代碼:

public Iterator<Student> iterator()  { return new ListIterator();  }

// an iterator, doesn't implement remove() since it's optional
private class ListIterator implements Iterator<Student> {
    private Node<Student> current = top;

    public boolean hasNext()  { 
        return current != null;                     
    }

    public void remove() { 
        throw new UnsupportedOperationException();  


    @SuppressWarnings("unchecked")
    public Student next() {
        if (!hasNext()) throw new NoSuchElementException();
        current = current.next; 
       return (Student)current;
    }
}

這是我的Driver類中的代碼,似乎有問題:

System.out.println("\nHere are all the elements of the Stack using an Iterator");
  System.out.println("--------------------------------------------------------");
  Iterator <Student> iter = myStack.iterator();
  while (iter.hasNext() )
      System.out.println(iter.next() );

這里有所有的課程:

堆棧: http//pastebin.com/2HVLVHuM

隊列類: http : //pastebin.com/3q537kHW

學生班: http//pastebin.com/UnBB7kPA

驅動程序類別: http//pastebin.com/yeA34MNd

我只能在堆棧類中寫代碼。 這樣做的重點是使用隊列實現堆棧。 希望這可以幫助

您需要在Student類中添加toString()方法。 迭代器正常工作,但是System.out.println()不知道如何顯示Student

像這樣向Student班級添加一些內容...

public String toString(){
    return name;
}

這樣,當您調用System.out.println() ,它可以輸出一個實數值。 當您調用System.out.println(Object) ,它總是嘗試輸出toString()值。 如果未定義此方法,它將輸出對象的java ID,即您所看到的。

首先,請查看nneonneo的答案,以了解next()方法中的轉換是否不正確。

其次,您的Iterator實現不正確。

next()在你的迭代函數返回元素current將其設定為后current.next

在迭代的最后一個元素上調用next()之后, hasNext()應該返回false。 但事實並非如此,因為current仍然指向您剛剛返回的元素。 因此,您將再次調用next() 在此方法中, current = current.next會將current設置為null ,然后將其返回。 既然hasNext是真實的,那應該不會發生,對吧?

出於同樣的原因,堆棧的第一要素也缺失了:您將current設置為堆棧的頂部元素,但是在輸出任何內容之前,您已經切換到current = current.next 您應該在完成輸出執行此操作。

currentStack迭代器被定義為Node<Student> 您可以使用強制轉換從next()方法返回current

因此, next()返回一個Node<Student> (類型轉換為Student ),而不是實際的Student 由於Node可能沒有toString方法,因此您將獲得默認輸出( Stack$Node@<addr> )。

要進行修復,請從next()返回類似current.item (假設存儲在Node中的item稱為item )。

使用迭代器的Stack的第一個元素列表顯然無法正常工作。 我不知道為什么。

因為您的迭代器正在返回Node<Student>而不是學生。 問題出在:

return (Student)current;

您可能試圖這樣做,但是出現了Incompatible Type錯誤:

return current;

因此,您嘗試通過投射進行修復。 問題在於節點不是學生。 一個節點包含一個學生。 您需要返回該節點包含的學生。

嘗試這個:

    return current.data;

不需要強制轉換,因為編譯器知道node的“數據”成員是Student,因為您聲明的當前類型為Node<Student> 這將解決您的學生打印錯誤的問題。 但是,正如@Konstantin指出的那樣,您的迭代器仍然損壞。 您需要將current的值保存在一個臨時變量中,移動current,然后返回該臨時變量。 這是一種可能的實現:

    public Student next() {
        if (current == null) throw new NoSuchElementException();
        Node<Student> result = current;
        current = current.next;
        return result.data;
    }

[結語]

您確實需要查看泛型教程 從上面粘貼的代碼尚不清楚,但在粘貼bin代碼中很明顯您正在使用Student作為類型參數。 這是非常不標准和令人困惑的。 慣例是使用大寫字母-通常為T。您應該像下面這樣聲明stack。 在所有使用Student的地方,都用T代替。

public class Stack <T> implements Iterable<T>{   // good

代替

public class Stack <Student> implements Iterable<Student>{ // bad

T表示稍后要確定的某種類型,您可以將Stack與任何類型的對象一起使用。 僅當您實際創建堆棧時才使用Student(或其他任何方式)

public static void main(String [] args)
{
    Stack<Student> x = new Stack<Student>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM