为什么我的ArrayList不能正确初始化?

时间:2013-04-05 20:24:47

标签: java arraylist

我无法让我的ArrayList初始化。我在第binaryTreeList.set(1, root);行说

时收到错误
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.set(Unknown Source)
    at BinaryTreeADT.<init>(BinaryTreeADT.java:18)
    at Driver.main(Driver.java:7)

我正在尝试使用ArrayList实现一个简单的二叉树,我希望“root”元素位于ArrayList位置1.由于某种原因,尽管添加了节点,但是`binaryTreeList的大小并没有增长对他们所有人。

以下是DriverBinaryTreeADTMyTreeNode

的代码
public class Driver {


    public static void main(String[] args) {
        MyTreeNode mtn = new MyTreeNode(3, 'R');
        BinaryTreeADT bt = new BinaryTreeADT(mtn);
        bt.printTree();
    }

}

BinaryTreeADT:

import java.util.ArrayList;
import javax.swing.tree.TreeNode;

public class BinaryTreeADT {

    private ArrayList<MyTreeNode> binaryTreeList;
    private MyTreeNode nullNode = new MyTreeNode(true);   //This creates a null node that initially populates the array.

    //Constructor with no root
    public BinaryTreeADT(){
        binaryTreeList = new ArrayList<MyTreeNode>(10);
    }
    public BinaryTreeADT(MyTreeNode root){
        binaryTreeList = new ArrayList<MyTreeNode>(10);
        initializeList();
        binaryTreeList.set(1, root);
    }
    private void initializeList(){
        for (int i = 0; i < binaryTreeList.size(); i++){
            binaryTreeList.add(nullNode);
        }
    }
    public void add(){

    }
    public void printTree(){
        for (int i = 0; i < binaryTreeList.size(); i++){
            if (binaryTreeList.get(i) != null)
                System.out.println(binaryTreeList.get(i).getNodeChar() + " | ");
        }
    }
}

MyTreeNode:

import java.util.Enumeration;
import javax.swing.tree.TreeNode;

public class MyTreeNode implements TreeNode {

    private int nodeKey;
    private char nodeChar;
    private boolean isNull;

    public MyTreeNode(int key, char letter){
        nodeKey = key;
        nodeChar = letter;
    }
    //Constructor for Null Node
    public MyTreeNode(boolean setNull){
        isNull = setNull;
    }
    public boolean isNull(){ //Tells if this is a null node
        return isNull;
    }

    @Override
    public Enumeration children() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean getAllowsChildren() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public TreeNode getChildAt(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int getChildCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int getIndex(TreeNode arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public TreeNode getParent() {
        // TODO Auto-generated method stub
        return null;
    }

    public int getNodeKey() {
        return nodeKey;
    }

    public void setNodeKey(int nodeKey) {
        this.nodeKey = nodeKey;
    }

    public char getNodeChar() {
        return nodeChar;
    }

    public void setNodeChar(char nodeChar) {
        this.nodeChar = nodeChar;
    }

    @Override
    public boolean isLeaf() {
        // TODO Auto-generated method stub
        return false;
    }

}

3 个答案:

答案 0 :(得分:9)

原因是这一行:

binaryTreeList.set(1, root);

因为binaryTreeList的大小为零。您构建了ArrayList并告诉它使用构造函数ArrayList(int initialCapacity)使initial Capacity10,但由于现在ArrayList内没有任何内容,所以{ {3}}正在返回0。这就是为什么在您的initializeList方法中,for loop在第一次迭代时退出,而不是使用binaryTreeList元素初始化10。因此binaryTreeList的大小仍然是0。这就是在索引1设置一个根本不存在的值的原因是抛出IndexOutOfBoundException

您应该将initializeList定义为:

    private void initializeList(){
     for (int i = 0; i < 10; i++){
        binaryTreeList.add(nullNode);
     }
    }

答案 1 :(得分:3)

ArrayList为空时,您正尝试将元素设置为位置1:

binaryTreeList.set(1, root);

而只是使用:

binaryTreeList.add(root);

答案 2 :(得分:2)

您的参考不受限制。您应该将第0个索引设置为根节点。但是,由于您的ArrayList为空(size = 0),您需要实际添加新元素,这将增加数组的大小。

binaryTreeList.add(root);

对于数组,索引从0开始,因此数组索引0处的元素是第一个元素,索引1处的元素是如果您有一个大小为n的数组,则最后一个元素将位于索引n-1

稍后,如果要更改某个索引处的元素,可以将第0个元素设置为root

binaryTreeList.set(0, root);

如果第一个参数(在这种情况下为0)小于或等于binaryTreeList.size()-1,这将有效。