簡體   English   中英

為什么我的ArrayList無法正確初始化?

[英]Why won't my ArrayList initialize properly?

我在使ArrayList初始化時遇到麻煩。 我在binaryTreeList.set(1, root);行出現錯誤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;
    }

}

原因是此行:

binaryTreeList.set(1, root);

因為binaryTreeList大小為零。 您已經使用構造函數ArrayList(int initialCapacity)構造了ArrayList並告訴它initial Capacity10 ,但是由於ArrayList內現在什么都沒有,所以ArrayList#size()返回0 這就是為什么在您的initializeList方法中, for loop在第一次迭代時退出的原因,該迭代未初始化具有10元素的binaryTreeList 因此, binaryTreeList的大小仍為0 這就是在索引1處設置一個根本不存在的值會IndexOutOfBoundException

您應該將initializeList定義為:

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

當您的ArrayList為空時,您嘗試將元素設置在位置1:

binaryTreeList.set(1, root);

而是使用:

binaryTreeList.add(root);

您的參考資料超出范圍。 您應該將第0個索引設置為根節點。 但是,由於ArrayList為空(大小= 0),因此您實際上需要添加新元素,這將增加數組的大小。

binaryTreeList.add(root);

對於數組,索引從0開始,因此數組索引0的元素是第一個元素,索引1的元素是第二個元素,依此類推。如果您有一個大小為n的數組,則最后一個元素將在索引n-1

以后,如果要更改某個索引處的元素,可以將第0個元素設置為root

binaryTreeList.set(0, root);

如果第一個參數(在這種情況下為0 )小於或等於binaryTreeList.size()-1 ,則binaryTreeList.size()-1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM