2014-10-01 88 views
3

正確,模糊,因爲該主題可能已經讓我首先承認這是一個家庭作業相關的問題。所以,如果你對這些問題有一些樂趣仇恨,應該警告。讓對象記住同類型的下一個對象

雖然我一直坐在那裏好幾個小時,但我已經很尷尬地不知道「還沒有得到它」。

所以我希望你們中的一些人能告訴我我失蹤的事情。

我想創建一個類,它存儲一個變量,並記住該類的下一個對象。

以下是我的主類:

public class SticksAndStones { 

public static void main(String[] args) { 

    Scanner scan = new Scanner(System.in); 
    String response = "n"; 
    Stick currentStick = null; 
    int numberOfSticks = 0; 

    while (response.equals("n")) { 

     System.out.println("What diameter should the stick have?"); 
     response = Integer.toString(scan.nextInt()); 

     currentStick = new Stick(Integer.parseInt(response), currentStick); 
     numberOfSticks++; 

     System.out.println("Are you done adding sticks? ('n' or 'y')"); 
     response = scan.next(); 

     while (!response.equals("y") && !response.equals("n")) { 
      System.out.println("Please type 'y' for yes, or 'n' for no."); 
      response = scan.next(); 
     } 
    } 

    for (int i = 0; i < numberOfSticks; i++) { 
     System.out.println(currentStick.getDiameter()); 
     currentStick = currentStick.getNext(); 
    } 

} 
} 

我的棒類的樣子:

public class Stick { 

int diameter; 
Stick stick; 

public Stick(int diameter, Stick stick) { 

    this.diameter = diameter; 
    this.stick = stick; 

} 

public int getDiameter() { 
    return diameter; 
} 

public Stick getNextStick() { 
    return stick; 
} 

現在你可以看到,我的課似乎能記住以前的棒,但不下一個以任何方式。

這是一個問題的原因,是因爲在我的SticksAndStones類的底部,我嘗試打印出每個伸出部分的直徑,但它們沒有以正確的順序出來。換句話說,第一根棍子最後出來,最後一根棍子先出來。

我不需要。我需要他們以相反的方式出來。首先堅持下去,如同第一次堅持。

我們在這個任務中唯一的限制就是我們不能使用任何形式的數組,列表,表格或數據庫。

我錯過了一些令人難以置信的簡單的東西嗎?

PS:會使用「家庭作業」標籤,但它不允許。

UPDATE

新SticksAndStones類:

import java.util.Scanner; 

public class SticksAndStones { 

public static void main(String[] args) { 

    Scanner scan = new Scanner(System.in); 
    String response = "n"; 
    int numberOfSticks = 0; 

    Stick firstStick = null; 
    Stick currentStick = null; 
    ; 
    Stick prevStick = null; 

    while (response.equals("n")) { 

     System.out.println("What diameter should the stick have?"); 
     response = Integer.toString(scan.nextInt()); 

     if (firstStick == null) { 
      firstStick = new Stick(Integer.parseInt(response)); 
      prevStick = firstStick; 
     } else { 
      currentStick = new Stick(Integer.parseInt(response)); 
      prevStick.setNextStick(currentStick); 
      prevStick = currentStick; 
     } 

     numberOfSticks++; 

     System.out.println("Are you done adding sticks? ('n' or 'y')"); 
     response = scan.next(); 

     while (!response.equals("y") && !response.equals("n")) { 
      System.out.println("Please type 'y' for yes, or 'n' for no."); 
      response = scan.next(); 
     } 
    } 

    currentStick = firstStick; 
    for (int i = 0; i < numberOfSticks; i++) { 
     System.out.println(currentStick.getDiameter()); 
     currentStick = currentStick.getNextStick(); 
    } 

} 
} 

我的棒類:

public class Stick { 

int diameter; 
Stick stick; 
Stick nextStick; 

public Stick(int diameter, Stick stick) { 

    this.diameter = diameter; 
    this.stick = stick; 

} 

public Stick(int diameter) { 
    this.diameter = diameter; 
} 

public int getDiameter() { 
    return diameter; 
} 

public Stick getNextStick() { 
    return stick; 
} 

public void setNextStick(Stick nextStick) { 
    this.nextStick = nextStick; 
} 
} 

一個微笑,一個擁抱誰可以告訴我爲什麼我打一個空指針異常。

+1

也許添加兩個引用? '堅持prevStick'和'堅持nextStick' – gtgaxiola 2014-10-01 17:10:31

+0

@gtgaxiola這將如何幫助?我在這些事情上有點慢,所以你可能會展示我如何使用它來使它工作? – ViRALiC 2014-10-01 17:11:27

+1

@ViRALiC lol「家庭作業」標籤實際上是一個很好的建議... – Alboz 2014-10-01 17:11:37

回答

1

重構的一點點走一段很長的路要走:

因爲它是不可能知道的施工時間是什麼next棒的構造不應該把它看作一個參數或至少給創建選項沒有nextStick

public Stick(int diameter) { 
    this.diameter = diameter; 
} 

對象開始循環,從而增加棒之前保持3個引用:

Stick firstStick = null; 
Stick currentStick; 
Stick prevStick = null; 

而且裏面你while loop你問你是否初始粘結已經被定義,或者如果你不斷增加枝直徑後...

if (firstStick == null) { 
    firstStick = new Stick(Integer.parseInt(response)); 
    prevStick = firstStick;     
} else { 
    currentStick = new Stick(Integer.parseInt(response)); 
    prevStick.setNextStick(currentStick); 
    prevStick = currentStick; 
} 

外面你的循環,當你打印的信息,您將currentStick指向firstStick和循環一如既往

currentStick = firstStick; 
for (int i = 0; i < numberOfSticks; i++) { 
    System.out.println(currentStick.getDiameter()); 
    currentStick = currentStick.getNextStick(); 
} 

更新

按照您更改爲Stick

這應該是它的樣子

public class Stick { 

    int diameter; 
    Stick stick; 

    public Stick(int diameter) { 
     this.diameter = diameter; 
    } 

    public int getDiameter() { 
     return diameter; 
    } 

    public Stick getNextStick() { 
     return stick; 
    } 

    public void setNextStick(Stick stick) { 
     this.stick = stick; 
    } 
} 
+0

你是最有幫助的例子,但我似乎有一些問題。你能否看一下,看看我是否在任何地方誤解了任何東西?你是我的英雄。 – ViRALiC 2014-10-01 18:45:58

+0

@ViRALiC輸入NullPointerException的輸入是什麼? – gtgaxiola 2014-10-01 18:50:30

+0

我正在嘗試最後一個漂亮的循環,你給了我。它似乎遇到了一個問題,但我似乎無法確定問題出在哪裏。 – ViRALiC 2014-10-01 18:53:55

0

你可以讓你的班級知道前一棒和下一棒。

public class Stick { 
    private int diameter; 
    private Stick previousStick; 
    private Stick nextStick; 

    public Stick(int diameter, Stick previousStick, Stick nextStick) { 
     setDiameter(diameter); 
     setPreviousStick(previousStick); 
     setNextStick(nextStick); 
    } 

    //getters and setters 
} 

然後在你的主要方法中,你需要適當地設置它們。這是你應該「做你的功課」的地方。以下是一些啓動幫助。想想如何使用它。

Stick lastStick; 
Stick currentStick; 

lastStick = currentStick; 
currentStick = new Stick(diameter, lastStick, null); 
lastStick.setNextStick(currentStick); 
+0

而且,除時間旅行外,程序應該在哪裏獲取構造函數的'nextStick'參數? – 2014-10-01 17:30:15

+0

正如我所展示的,使用null,然後使用setter將其設置。 – 2014-10-01 17:35:12

+0

爲什麼在構造函數中設置它總是爲null? – Keppil 2014-10-01 17:42:22

1

嗯,很明顯沒有Stick可以「記住」下一棒首次創建時,因爲沒有任何下一棒呢。但是,如果只Stick構造函數將以前的棒作爲參數,然後 - 雖然它很醜的 - 它可以修改以前堅持有新的一個參考:

public Stick(int diameter, Stick previousStick) { 
    this.diameter = diameter; 
    this.previous = previousStick; 
    previousStick.next = this; 
} 

當然,這假設在Stick類中有一個新的和一個重命名的字段。

這將是更好的形式創建新Stick,但是之後添加正向參考,使Stick構造函數不修改它的參數:

public Stick(int diameter, Stick previousStick) { 
    this.diameter = diameter; 
    this.previous = previousStick; 
} 

// ... main() ... 
    Stick newStick = new Stick(Integer.parseInt(response), currentStick); 

    currentStick.setNext(newStick); 

而且,如果你希望能夠在前進方向上遍歷鏈表(這是您創建的內容),那麼您需要在某處保留對第一個Stick的引用。如果您不需要向後遍歷列表,則可以省略跟蹤該引用(在這種情況下,Stick構造函數不需要將Stick作爲參數)。我會留下剩下的部分給你解決。

+0

擔心修改構造函數參數可能在當前上下文中有點保留。 – 2014-10-01 17:32:40

1

避免添加第二個參考,因此每個棒記得前一個是寫,做棒鏈的post-order traversal遞歸方法的另一種選擇:

public static void printSticks(Stick s) { 
    if (s != null) { 
    printSticks(s.getNextStick()); 
    System.out.println(s.getDiameter()); 
    } 
} 

這種做法是不恰當的一個很長的名單,因爲它是受到堆棧溢出錯誤,但它是你如何使用遞歸算法來解決數據結構塔的侷限性的例子你一直在努力工作。

+0

+1我喜歡這種方法 – gtgaxiola 2014-10-01 18:45:26

相關問題