【问题标题】:Adding an integer to an array inside a node将整数添加到节点内的数组中
【发布时间】:2014-05-03 13:46:19
【问题描述】:

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

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

创建的类节点:

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) {

}
}

【问题讨论】:

  • 为什么不直接使用ArrayList
  • 你的意思是没有节点?好吧,分配声明我们必须使用节点。
  • 我建议用 JDK 的 ArrayList 替换 DynamicArrayOfInts,而不是摆脱 Node 类。

标签: java arrays integer add


【解决方案1】:

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

然后在你的 add 方法中,检查当前节点的数组是否未满(这很容易做到,因为你知道索引的值和每个节点的元素数)。

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

这就是我将如何实现它。

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;
        }
    }
}

一个小 main 来展示它的行为方式:

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]

【讨论】:

    【解决方案2】:

    不幸的是,在这种情况下,您必须创建一个新数组(是的,我感觉到您的痛苦),它将比data 多一个元素。您必须将 data 的内容复制到新数组中,并将最后一个元素设置为您的 int 值。这不太优雅,这就是为什么 Mureinik 建议您应该使用 ArrayListNode (ArrayList&lt;Node&gt;) 来代替。我什至可以加强他的建议以使您的解决方案更通用,并告诉您改用AbstractList&lt;Node&gt; 并用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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2012-07-02
      • 2022-01-15
      相关资源
      最近更新 更多