2014-10-01 57 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

相关问题