当前位置: 首页 > 知识库问答 >
问题:

将泛型类型的元素添加到LinkedList的arrayList中

太叔天宇
2023-03-14

我想在java中创建一个哈希表类,将键和值对存储在链表的ArrayList中

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

然后,我想创建一个链接列表对象,然后可以使用该对象在arrayList的每个索引内创建一个新的链接列表。为此,我声明:

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

然后我设置了add函数以将元素添加到LinkedList的第一个索引中,该索引位于arrayList的哈希键索引中:

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)

我无法追踪这个指数越界错误的来源,任何人都可以提供建议。我在使用arrayList方面相当新,这让我觉得我最初对arrayList的声明是不正确的。

共有2个答案

方河
2023-03-14

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

当列表为空并且您在索引7处添加了一些东西时,您希望列表在第一个位置包含什么,在索引6处包含什么?(我曾经创建了一个列表子类,当添加索引大于列表大小时,将所有内容填充为null,但这种行为不足以成为List语义学的一部分。

[根据此处的评论和praseodym的回答进行编辑]

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

皮献
2023-03-14

您将数组列表的容量与其大小混淆了。来自Oracle Java文档:

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

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

 类似资料:
  • 问题内容: 我有一个ArrayList通用通配符类型,它以Number为扩展名。我正在尝试将整数值添加到ArrayList中。 但是它给我一个错误,说 类型中的方法add(int,capture#2-of?)不适用于参数(int)。 我也尝试过这种方式,但是给了我同样的错误 错误是: 类型中的方法add(int,capture#2-of?)不适用于参数(int) 问题答案: 你不能 该部分基本上告

  • 我有一个ArrayList泛型通配符类型,它以Number作为扩展。我试图将整数值添加到ArrayList中。 方法add(int,capture#2-of?)在类型中,不适用于参数(int)

  • 注意:“else”语句只是出于测试目的,似乎表明if语句没有正常工作,因为当我测试时,它总是被触发。

  • 问题内容: 我在列表上使用通配符和下限泛型,但是编译器抛出错误。 码: 错误: 类型List中的方法add(capture#8-of?super Integer)不适用于参数(Number) 使用,应该允许我添加任何类型或其超类型的对象,例如Number或Object。我已经进行了一些SO讨论,但是找不到为什么我应该克服错误。 问题答案: 使用,应该允许我添加Integer类型或其超类型的任何对象

  • 我有一个扩展a的类B。a存储一个Item的列表,B存储一个BItem的列表 在“a”中,我有一个使用[?extends AItem]的ArrayList。 我假设这意味着我可以将这个ArrayList用于扩展aItem的任何类型的对象。

  • 我正在寻找一个类型安全的,选中的解决方案,以添加一个元素到一个列表,它的泛型需要一个类和一个接口。该示例说明了我想要做的事情--将一个对象添加到一个列表中,该对象的类型扩展了并实现了,其中。 当然,将转换为会解决编译错误,但这将被取消检查。 有什么办法解决这个问题吗?如果没有,有没有人知道编译器不允许这样做的原因?