无法弄清楚节点在我的代码中是如何工作的

时间:2013-05-29 07:15:15

标签: java

我是一个java初学者,我正在尝试创建一个可以按随机顺序创建名称链接循环的代码,所以这是我到目前为止所获得的代码。

我认为问题出在assassinGame class,但我认为它应该返回节点,以便我可以在第二个类中使用。但我真的不知道如何将此名称放入节点。    **和第二类要求我打印每两个名字的最后一个,这意味着,如果列表是1,2,3,4,5。所以它应该打印出2,3,4,5,这就是我的想法。

**第一个类是构造函数,它们都不是主要方法。

private Node start;       

private static class Node {
    public int val; 
    public Node next;

    public Node(int v, Node n) {
            val = v;
            next = n;
    }
}

public AssassinGame(String[] names) {
    Random name = new Random();
    int num = name.nextInt(10)+1;

    String[] peoples = {"Bob","Jill","Tom","Brandon","Stontaigh",
                        "Loofautt","Grennoogh","Jshjnt","Zjlouv",
                        "Fabeih","Aishof","Hoir"};
    List<String> nam = Arrays.asList(peoples);
    Collections.shuffle(nam);
    int index = new Random().nextInt(nam.size());
    String anynames = nam.get(index);
    System.out.println("Your random name is" + anynames + "now!");
    return nam;
}

public void print() {
    while(nam.next!=null) { System.out.println(nam.next); }
}

1 个答案:

答案 0 :(得分:1)

print方法存在一些问题:

  • 它应该采用一个参数,即要打印的列表/节点。目前它不需要参数,因此无法访问nam变量。
  • 您的while循环正在检查nam.next是否为空(罚款),但您没有在循环中更改nam。如果它在开始时是真的,它将永远是真的,你将获得无限循环。您可能希望在其中添加一行nam = nam.next
  • 我认为对于nam的每个实例,您可能想要打印nam.val。这肯定会避免当前的错误,即列表的第一个元素不会被打印出来。

除此之外,您在将ArrayList<String>转换为Node时会遇到问题,因为您已经定义了节点,因此它们只保留int。您可以使用泛型使您的节点保持任何类型(这正是Java的内置集合的工作方式),通过如下定义:

private static class Node<T>
{
    public T val; 
    public Node next;

    public Node(T v, Node n)
    {
        val = v;
        next = n;
    }
}

在类名后面声明<T>参数,并将int的声明替换为T即可。

最后,您需要一种将标准Java集合转换为Node类的方法。您是否知道可以让您这样做的算法?我不想为你解决这个问题,即使我很乐意帮助解决这些问题......