我无法让我的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实现一个简单的二叉树,我希望“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;
}
}
答案 0 :(得分:9)
原因是这一行:
binaryTreeList.set(1, root);
因为binaryTreeList
的大小为零。您构建了ArrayList
并告诉它使用构造函数ArrayList(int initialCapacity)
使initial Capacity
为10
,但由于现在ArrayList
内没有任何内容,所以{ {3}}正在返回0
。这就是为什么在您的initializeList
方法中,for loop
在第一次迭代时退出,而不是使用binaryTreeList
元素初始化10
。因此binaryTreeList
的大小仍然是0
。这就是在索引1
设置一个根本不存在的值的原因是抛出IndexOutOfBoundException
。
您应该将initializeList
定义为:
private void initializeList(){
for (int i = 0; i < 10; i++){
binaryTreeList.add(nullNode);
}
}
答案 1 :(得分:3)
当ArrayList
为空时,您正尝试将元素设置为位置1:
binaryTreeList.set(1, root);
而只是使用:
binaryTreeList.add(root);
答案 2 :(得分:2)
您的参考不受限制。您应该将第0个索引设置为根节点。但是,由于您的ArrayList为空(size = 0),您需要实际添加新元素,这将增加数组的大小。
binaryTreeList.add(root);
对于数组,索引从0
开始,因此数组索引0
处的元素是第一个元素,索引1
处的元素是如果您有一个大小为n
的数组,则最后一个元素将位于索引n-1
。
稍后,如果要更改某个索引处的元素,可以将第0个元素设置为root
:
binaryTreeList.set(0, root);
如果第一个参数(在这种情况下为0
)小于或等于binaryTreeList.size()-1
,这将有效。