java - 为什么我的 ArrayList 无法正确初始化?

标签 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 实现一个简单的二叉树,并且我希望“根”元素位于 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();
    }

}

二叉树ADT:

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() + " | ");
        }
    }
}

我的树节点:

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

}

最佳答案

原因是这一行:

binaryTreeList.set(1, root);

因为 binaryTreeList 的大小为零。您已经构造了 ArrayList 并使用构造函数 ArrayList(int initialCapacity) 告诉其初始容量10 ,但是由于 ArrayList 内现在什么都没有,所以 ArrayList#size()返回为 0。这就是为什么在您的 initializeList 方法中,for 循环 在第一次迭代时退出,而没有使用 10 初始化 binaryTreeList > 元素。因此,binaryTreeList 的大小仍然是 0。这就是在索引 1 处设置根本不存在的值会引发 IndexOutOfBoundException 的原因。

您应该将 initializeList 定义为:

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

关于java - 为什么我的 ArrayList 无法正确初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15842883/

相关文章:

java - Java 错误和语法教程

java - 如何根据第一个列表中的字段将第二个列表与第一个列表连接?

java - java中这两个对象初始化有什么区别?

java - Scala - 如何过滤 KStream(Kafka Streams)

java - 每个抛出异常的语句的 try/catch 是否被视为反模式?

java - 改变牙套的样式

java - 从构造函数返回 ArrayList 的集合

c# - 如何在控制台中将我的项目对齐在同一行?

java - 元音变音/变元音在 Postgresql 中显示不正确(文本类型和字符类型不同)

java - Java 中的 Facebook Rest 客户端