向节点内的数组添加整数

时间:2014-05-03 13:46:19

标签: java arrays integer add

所以我的问题的概念是:假设我们有节点。每个节点都有一个整数数组。现在,我们必须在数组的末尾添加一个整数。我们怎么做?

这是我到目前为止所做的:

创建的类Node:

public class Node {
private int[] data;

Node next;

public Node(int n, Node nxt) {
    data = new int[n];
    next = nxt;
}

}

然后是动态数组列表类:

public class DynamicArrayOfInts {

private Node head = null; 
private int numOfElementsPerNode = 0;

public DynamicArrayOfInts(int elementsPerNode) {
    numOfElementsPerNode = elementsPerNode;
}

public void add(int e) {

}
}

2 个答案:

答案 0 :(得分:0)

您应该在Node类中添加一个属性,以了解当前Node的数组的当前索引。我还会在DynamicArrayOfInts中添加一个属性,以保留当前节点的引用。

然后在你的add方法中,检查当前节点所拥有的数组是否未满(可以轻松完成,因为你知道索引的值和每个节点的元素数)。

如果不是这种情况(或者如果第一次添加调用的头部为空),则创建一个新节点并在其数组中添加该元素,否则只需填充当前节点的数组的下一个插槽。

这就是我实现它的方式。

class DynamicArrayOfInts {
    private Node head, current; 
    private int numOfElementsPerNode;

    public DynamicArrayOfInts(int elementsPerNode) {
        if(elementsPerNode <= 0) 
            throw new IllegalArgumentException("elementsPerNode must be > 0");
        numOfElementsPerNode = elementsPerNode;
    }

    public void add(int e) {
        if(head == null){
            head = new Node(numOfElementsPerNode, null);
            head.data[head.index++] = e;
            current = head;
            return;
        }
        if(current.index == numOfElementsPerNode){
            Node n = new Node(numOfElementsPerNode, null);
            current.next = n;
            current = n;
        }
        current.data[current.index++] = e;
    }

    @Override
    public String toString(){
        StringBuilder sb = new StringBuilder();
        Node n = head;
        while(n != null){
            sb.append(Arrays.toString(n.data));
            n = n.next;
        }
        return sb.toString();
    }

    private static class Node {
        private int[] data;
        private int index;
        private Node next;

        public Node(int n, Node nxt) {
            data = new int[n];
            index = 0;
            next = nxt;
        }
    }
}

显示其行为的小主要内容:

public static void main(String[] args){
    int[] toAdd = {5,7,10,-1};
    DynamicArrayOfInts d = new DynamicArrayOfInts(2);
    for(int i : toAdd){
        d.add(i);
        System.out.println(d);
    }
} 

输出:

[5, 0]
[5, 7]
[5, 7][10, 0]
[5, 7][10, -1]

答案 1 :(得分:0)

不幸的是,在这种情况下你必须创建一个新的数组(是的,我感到很痛苦),它将比data多一个元素。您必须将data的内容复制到新数组中,并将最后一个元素设置为int值。这不是太优雅,这就是Mureinik建议您使用ArrayList NodeArrayList<Node>)的原因。我甚至可以增强他的建议,使你的解决方案更加通用,并告诉你使用AbstractList<Node>代替并用ArrayList实例化它,但这可能比你当前的水平太高级了(没有冒犯,我们一切都在那里)。至于你的确切问题,我想象你的Node类中有如下方法来处理这个问题。

public void push(int newValue) {
    int[] newData = new int[data.length + 1];
    for (int i = 0; i < data.length; i++) {
        newData[i] = data[i];
    }
    newData[data.length] = newValue;
    data = newData;
}