【问题标题】:How to declare an ArrayList of Genric ArrayLists (2d Arraylists) in java?如何在java中声明一个Generic ArrayList(2d Arraylist)的ArrayList?
【发布时间】:2021-02-21 22:50:49
【问题描述】:

所以我一直在尝试创建一个 ArrayList of ArrayList of Generics。基本上我有一个名为 Color 的通用类(它在运行时接受 Integer/Long/short 值)。现在我想在一个名为 Picture 的类中创建一个“颜色”类型的二维数组列表。我有构造函数和arrayList 的声明。但我不明白的是为什么 ArrayList 的大小最终为 0,即使我声明大小大于 0。在代码之后更多关于此...

import java.util.ArrayList;

public class Picture{

    private ArrayList<ArrayList<Color<?>>> pic;
    
    //constructor that takes in height and width of 2d array, and a Color parameter that will be populated in the 2d list
    public Picture(int height, int width, Color color){ 
        
        if((height <= 0) || (width<=0)){
            throw new IndexOutOfBoundsException("invalid height and/or width");
        }
        else{
            pic = new ArrayList<ArrayList<Color<?>>>(height);
            System.out.println("size of given array: "+ pic.size()); //for error handling purposes
            for(int r =0; r< pic.size(); r++ ){
                pic.set(r, new ArrayList<Color<?>>(width));
                for(int c = 0; c< width; c++){
                    pic.get(r).set(c, color);
                }

            } 

        }

    }

}

每次我通过创建一个新的图片对象(如 Picture pic1 =new Picture(3,4, new Color&lt;Integer&gt;(2)); 或任何大于 0 的值作为高度和宽度)来运行代码来测试它时;我总是最终得到“给定数组的大小:0”(来自System.out.println() 语句)并且for循环甚至没有发生,因为列表的大小最终为0。最后是整个颜色对象应该在 2d ArrayList 中发生的事情根本不会发生,“2d ArrayList - pic”最终什么都不包含。

我不明白我哪里出错了以及 2d ArrayList 被分配的大小为 0,即使我为它分配了“高度”一个保证大于零的值(因为 if陈述)。我假设我声明/初始化了 2d Arraylist - pic 错误。有人可以帮我吗?也请随时指出我的代码中的任何其他错误。

谢谢

【问题讨论】:

  • ArrayList&lt;ArrayList&lt;? extends Color&gt;&gt; pic; ?
  • 所以我正在尝试创建一个 Color 的二维数组列表 - 这是一个泛型类。你说的是它是一个上限,我正在尝试创建一个 Color 子类的二维数组列表。我可以使 Picture 类通用并执行类似ArrayList&lt;ArrayList&lt;Color&lt;E&gt;&gt;&gt; pic; 的操作,但这会给我的其他类带来其他问题。除了Color&lt;?&gt;,还有其他方法吗?

标签: java generics arraylist multidimensional-array declaration


【解决方案1】:

你误解了 ArrayList / 那个构造函数。

ArrayList 有 两个 类似大小的属性:

容量

这个数字几乎从不有趣,意义也很小。这是一个实现细节:容量为 10 的数组将允许您在不调整内部数组大小的情况下添加最多 10 个元素(什么是内部数组调整大小?一个.. 内部实现细节。我告诉过你这基本上是不相关的)。如果您尝试添加第 11 个,那效果很好,并且作为其中的一部分,容量会自动增加一点(如果有记忆的话,可能会增加到 15 个)。在内部,ArrayList 有一个包含数据的数组(因此得名),如果您尝试将一个项目添加到一个容量已满的数组列表,则在内部创建一个新的更大的数组,旧数组被复制到新数组,然后新数组取代数据存储,旧数组被丢弃。这就是容量的意义所在。

非常很少有方法可以引起注意,而且您很少需要关心。

尺寸

这是指列表中的实际条目数。它必须是capacity 或更小。

new ArrayList&lt;Whatever&gt;(10) 创建一个容量为 10 且大小为 0 的数组列表。您不能(轻松)创建一个包含 X 个空指针的数组列表,而且您通常也不想这样做。例如,在这种简单的情况下,您只需 [A] 将 r&lt;pic.size() arg 替换为 r&lt;height,然后 [B] 将 .set 替换为 .add。

【讨论】:

  • 哦,我太笨了,我忘了这个。我只是设置了大小/容量,但实际上还没有添加任何东西,我在考虑数组 - 因为当您声明数组的大小时,您可以在添加任何内容之前访问它。
猜你喜欢
  • 2013-02-15
  • 2023-03-19
  • 1970-01-01
  • 2012-06-15
  • 2016-07-19
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 2016-10-19
相关资源
最近更新 更多