2013-04-05 77 views
0

我让我的ArrayList初始化时遇到了麻烦。我在说为什么我的ArrayList不能正确初始化?

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.set(1, root);得到一个错误,`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; 
    } 

} 

回答

2

您的参考是超出界限。您应该将第0个索引设置为您的根节点。然而,由于你的ArrayList是空的(size = 0),你需要实际上加上这个新元素,这会增加数组的大小。

binaryTreeList.add(root); 

随着阵列,指数在0启动,所以在阵列的索引0的元素是第一元件,在索引1的元素是第二等,如果你有大小n的阵列,最后一个元素将在索引n-1

以后,如果你想在一个特定的指数变化的元素,你可以第0个元素设置为root

binaryTreeList.set(0, root); 

(在这种情况下0)这将工作提供了第一个参数小于或等于binaryTreeList.size()-1

+0

我做了,看看我的方法'initialize()'。我不明白为什么这是无所事事。 – CodyBugstein 2013-04-05 20:52:21

+0

因为'binaryTreeList.size()'是'0'。 'for(int i = 0; i Bucket 2013-04-05 20:57:57

+0

它的工作!这太奇怪了,你能向我解释为什么当我初始化数组列表时,它实际上并没有为元素创建空间? – CodyBugstein 2013-04-05 21:21:50

9

原因是这一行:

binaryTreeList.set(1, root); 

由于binaryTreeList的大小为零。您已经构建了ArrayList并告知它使用构造函数ArrayList(int initialCapacity)initial Capacity设置为10,但由于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); 
    } 
    } 
+0

虽然迭代通过一个空列表是没有用的,但是这个循环并没有迭代它。所以它不能抛出'IndexOutOfBoundsException'问题稍微向下,其中'binaryTreeList.set(1,root);'尝试在索引1中添加一个元素,而大小为0(正如Reimeus已经指出的) – GameDroids 2013-04-05 20:39:04

+0

@GameDroids:我的坏..完全没有这一点..谢谢指出。 – 2013-04-05 20:44:39

+0

呃??你错过了'initialize'方法吗?我正在使用Node初始化每个插槽,但数组仍然认为它本身为空 – CodyBugstein 2013-04-05 20:50:59

3

您正试图在位置1,设置元素,当你ArrayList是空的:

binaryTreeList.set(1, root); 

,而不是仅仅使用:

binaryTreeList.add(root); 
+0

但是我特别希望根位于位置1,而不是位置0.另外,稍后我会添加各个点上的元素,不是特别按顺序排列的。例如,接下来我可能想添加一个节点到位置8. – CodyBugstein 2013-04-05 20:51:52