import java.util.*;
import java.util.ArrayList;
class MyHashTable<K extends Comparable<K>, E> {
private ArrayList<Entry<K,E>> bucket = new ArrayList<Entry<K,E>>();
private int bucketSize;
private int collisionCount = 0;
// Constructor that takes number of buckets as input
public MyHashTable( int len )
{
this.bucketSize = len;
for ( int i = 0; i < len; i++ )
{
bucket.set( i, null ); //ERROR APPEARS ON THIS LINE
}
}
并且当我从另一种方法调用时被唤起:
MyHashTable<MyString, AnimalRecord> linearProbing = new MyHashTable<MyString, AnimalRecord>(59);
linearProbing.put( lion.name, lion );
答案 0 :(得分:4)
private ArrayList<Entry<K,E>> bucket = new ArrayList<Entry<K,E>>();
创建一个空的arrayList。
set
方法
使用指定的元素
替换此列表中指定位置的元素 抛出:IndexOutOfBoundsException
- 如果index
超出范围(index < 0 || index >= size()
)
所以
bucket.set( i, null );
尝试将null设置为i
元素(从0
开始)。但是arraylist是空的,这就是你得到例外的原因。
你想要的是add
方法:
for ( int i = 0; i < len; i++ )
{
bucket.add(null);
}
将null
添加到ArrayList
的末尾。
答案 1 :(得分:2)
您需要第一眼添加而不是设置。
抛出: IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; = size())
您遇到了条件index >= size()
答案 2 :(得分:1)
最初,ArrayList
为空,当您创建它的新实例时:
private ArrayList<Entry<K,E>> bucket = new ArrayList<Entry<K,E>>();
当您在set
上调用ArrayList
方法时,您正在尝试替换未找到的现有元素,因为该列表为空。
如果将列表中的元素添加到您想要的内容,则应使用add
而不是set
。
答案 3 :(得分:0)
您的ArrayList(存储桶)中没有任何元素 - bucket.set替换元素,它不会插入元素。
请参阅http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#set(int,%20E)
调用ArrayList.add(),因为它会将一个元素附加到数组的末尾。
答案 4 :(得分:0)
我认为,相当明显的是,当您尝试访问其上方的索引(最多58个)时,您的ArrayList是使用默认容量(10)创建的。
答案 5 :(得分:0)
查看Class ArrayList的Java文档以及您正在使用的方法:
方法集“用指定的元素替换此列表中指定位置的元素。”
在方法调用时,您没有带有Element 59的ArrayList。使用ArrayList()Standard-Constructor构造的ArrayList的初始大小为10.
您可以使用构造函数ArrayList(int initialCapacity)
在此处查找文档:
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html