[英]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的大小並未增長。他們。
這里是我的代碼的順序為Driver
, BinaryTreeADT
和MyTreeNode
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 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);
}
}
當您的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.