繁体   English   中英

添加通用类型的元素 <T> 到LinkedList的arrayList

[英]Adding a element of Generic type <T> to an arrayList of LinkedList's

我想在Java中创建一个哈希表类,在其中将键值对存储在链表的ArrayList中。 我通过声明来做到这一点

 ArrayList<LinkedList<T>> storage = new ArrayList();

然后,我想创建一个linkList对象,该对象可用于在arrayList的每个索引内创建一个新的链表。 我通过声明:

  LinkedList<T> list = new LinkedList<T>();

然后设置我的add函数,将元素添加到arrayed的Hashed键索引内的LinkedList的第一个索引中,如下所示:

public void add(K key, T value){    
int arrayListIndex = (key.hashCode()) % this.initialCapacity;
    System.out.println(arrayListIndex); //This tells us where we access the Array List;


    if (hashBrown.get(arrayListIndex) == null){

        hashBrown.add(arrayListIndex, list);
        hashBrown.get(arrayListIndex).addFirst(value);
    }
}

每次运行此代码时,我都会收到一个错误,索引为7,大小为0。这将导致错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:571)
    at java.util.ArrayList.get(ArrayList.java:349)
    at FastHashtable.add(FastHashtable.java:72)
    at FastHashtable.main(FastHashtable.java:145)

我无法找到该索引超出范围错误的出处,任何人都可以提供建议。 我在使用ArrayLists时是相当陌生的,这使我认为arrayList的原始声明不正确。

您正在将ArrayList容量与其大小混淆。 从Oracle Java文档中:

每个ArrayList实例都有一个容量 容量是用于在列表中存储元素的数组的大小。 它总是至少与列表大小一样大。 将元素添加到ArrayList ,其容量会自动增长。 除了添加元素具有固定的摊销时间成本外,没有指定增长策略的详细信息。

相反,您应该考虑创建一个普通数组(例如Object[] a = new Object[maxSize] ),在其中您可以实际为任意索引值分配对象(在这种情况下为链接列表)。 如果只想存储链接列表,请创建一个LinkedList<T>[]数组。

如果其中有0个元素,则不能将其添加到索引7的列表中。 您只能在末尾添加(使用不带索引的add方法)或在不大于当前列表的size()

当列表为空并且在索引7处添加内容时,您期望列表在第一位置包含什么,在索引6处包含什么? (我曾经创建过一个list的子类,当附加索引大于列表的大小时,它会使用null填充索引中的所有内容,但是这种行为并不通用,不足以成为List语义的一部分。


[编辑以回应此处的评论和praseodym的回答]

您可以简单地用空值填充(数组)列表,而在首次访问相应位置时,将其替换为链接列表。 (不过,请确保使用set而不是add ,这可能也是您上面想要的。)或者,您可以创建所需大小的数组(默认情况下将充满null )并将其“包装”通过Arrays.asList放入一个(不可调整大小的)列表。 但是,您必须忽略“未经检查的转换”警告(但是,并不是在使用数组时可以避免出现警告)。 另外,我建议您阅读“ 编程到接口,而不是实现 ”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM