2013-04-05 78 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