在java中的ArrayList中追加一个对象

时间:2013-11-28 03:35:31

标签: java arraylist

我正在做练习,但我遇到了一个问题。

NodeList中,创建static method Node arrayToNode(String[] arr) 它将String数组转换为列表。您的方法应该创建第一个Node, 然后遍历数组的其余部分,在每一步创建Node并使用 追加将创建的Node放在列表的末尾。在上面测试这个方法 命令行参数。如果array为空,会发生什么?

目前我的代码是这样的

public static Node arrayToNode(String[] arr) {
    Node first = new Node(arr[0]);
    ArrayList<Node> list = new ArrayList<Node>();
    for(int i=1; i<arr.length;i++){
        list.add(new Node(arr[i]));
    }
}

你可以看到没有退货声明YET。 我不确定写这个练习的人是不是写了Node而不是void,但我不能问他。

追加方法是

public void append(Node fin){
    if(next==null)
        next=fin;
    else
        append(next);
}

,实例变量和构造函数如下:

public String value;
public Node next;

public Node(String s){
    value =s;
    next=null;
}

我很不确定当ArrayList继续扩展时将节点放在列表末尾意味着什么。 另外,我对如何在TestNode类中使用部署append方法有疑问。


感谢您的评论。 我现在已经意识到问题是什么,并做了适当的改变。

public static Node arrayToNode(String[] arr){
    Node first = new Node(arr[0]);
    for(int i=1; i<arr.length;i++){
        Node nd = new Node(arr[i]);
        nd.append(nd);
        first.next=nd;
    }

    return first;
}
你能看出这是否正确?

1 个答案:

答案 0 :(得分:0)

除非我遗漏了某些内容,否则你的附加方法应为:

public void append(Node fin) {
    if (next == null)
        next = fin;
    else
        next.append(fin); // <- this line changed
}

这会将fin追加到该行,直到它到达列表的末尾,而你在OP中的方式会给出无限递归。

如果它应该是这样的话那么创建列表非常简单。您可以将每个值附加到原始值。

public class Node {
    public static void main(String[] args) {
        Node begin = arrToLL(new String[] {
            "hello 1", "hello 2", "hello 3", "hello 4", "hello 5"
        });

        while (begin != null) {
            System.out.println(begin.val);
            begin = begin.next;
        }
    }

    static Node arrToLL(String[] arr) {
        if (arr == null) {
            return null;
        } else if (arr.length == 0) {
            return new Node("null");
        }

        int ind = 0;
        Node begin = new Node(arr[ind++]);

        while (ind < arr.length) {
            begin.append(new Node(arr[ind++]));
        }

        return begin;
    }

    /* instance */

    String val;
    Node next;

    Node(String val) { this.val = val; }

    void append(Node ap) {
        if (next == null) {
            next = ap;
        } else {
            next.append(ap);
        }
    }
}

输出是:

hello 1
hello 2
hello 3
hello 4
hello 5

在&#34;内列出&#34;循环你也可以&#34;提前洗牌&#34;通过将next分配给我的println循环中的变量。这样你就不会利用&#34;传递&#34;。

public static Node arrayToNode(String[] arr){
    Node first = new Node(arr[0]);
    for(int i=1; i<arr.length;i++){
        Node nd = new Node(arr[i]);
        nd.append(nd); // <- appends nd to itself
        first.next=nd; // <- always assigns the new value to first
    }

    return first;
}

接近但我已经评论了错误的两条线。我想你最终会得到的是:

  • 第一个节点,第一个数组元素链接到
  • 第二个节点,最后一个数组元素链接到
  • 本身(第二个节点)

您可以在没有append的情况下执行此操作,但需要另一个变量来进行随机播放:

public static Node arrayToNode(String[] arr){
    Node first = new Node(arr[0]);
    Node current = first;

    for(int i=1; i<arr.length;i++){
        Node nd = new Node(arr[i]);

        current.next = nd; // <- append the new node to the last
        current = nd; // <- shuffle ahead to the new one
    }

    return first;
}

否则如果我认为附加有错误你可以做一些更接近我的主要例子的事情(如果你想要的话包括随机播放,并且for循环也可以。)