【问题标题】:ArrayList<List<C>> exception [duplicate]ArrayList<List<C>> 异常 [重复]
【发布时间】:2015-05-05 23:07:08
【问题描述】:

谁能告诉我我做错了什么,因为我有这个错误:

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引: 0, 尺寸: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:653) 在 java.util.ArrayList.get(ArrayList.java:429) 在 javaapplication4.JavaApplication4.main(JavaApplication4.java:41)

    ArrayList<List<Cartas>> tabuleiro = new ArrayList<>();

    ArrayList <Integer> pos = new ArrayList<>();

    pos.add(40);pos.add(50);pos.add(60);pos.add(31);pos.add(41);pos.add(22);pos.add(32);pos.add(42);pos.add(13);pos.add(23);pos.add(33);pos.add(24);pos.add(34);

        for(int x=0; x<9; x++){
            for(int y=0; y<7; y++){
                for (Integer p : pos) {
                    if (p == (x*10+y)) {
                        tabuleiro.get(x).set(y, new Cartas(x,y,false));
                    }
                }
            }
        }

        for(int x=0; x<9; x++){
            for(int y=0; y<7; y++){
                System.out.println(tabuleiro.get(x).get(y).nomeCV);
            }
        }

【问题讨论】:

  • 答案取决于您希望如何将元素插入其中,以及您希望如何阅读它们。然后我们可以帮助您决定如何实施。
  • 这个问题比较琐碎。查找有关在 Java 中使用数组的文档/教程。专注于使用二维数组。尽管一旦您知道如何使用一维数组,您就已经大功告成了。二维数组就像矩阵一样工作。 arr[i][j] 本质上是i 行、j 列的值。了解这一点后,请考虑如何将值分配给 2D 数组中的位置以形成您所描述的模式。
  • @VivinPaliath OP 说“我只想知道如何创建双向数组列表”。你说的是数组,不是ArrayList
  • Two Dimensional ArrayList 的可能重复项。另见thisthis
  • 另一种方法是使用HashMap&lt;IntPair, C&gt; 并定义您自己的具有两个int 值的IntPair 类。

标签: java


【解决方案1】:

要创建一个包含“C”对象的 2D ArrayList,您可以实例化一个 2D 列表,例如:

C obj = new C(); //Creates a "C" object
ArrayList<ArrayList<C>> myArray = new ArrayList<ArrayList<C>>(); //Creates a 2 Dimensional ArrayList
myArray.add(new ArrayList<C>); //Adds an ArrayList<C> to the the 2D ArrayList
myArray.get(0).add(obj); //Adds a "C" object to the ArrayList that was added on the previous line

如需更好地理解 ArrayList,请参阅link

【讨论】:

    【解决方案2】:

    在数组列表中创建数组列表:

    ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
    

    (注意,此时list 内部没有任何内容)然后,您在list 中创建一个新的ArrayList,如下所示:

    list.add(new ArrayList<String>);
    

    然后:

    list.get(0).add("Hello);
    

    list 的第 0 个索引处向 ArrayList 添加一个字符串

    【讨论】:

      【解决方案3】:

      你可以使用 Guava Table

      Table<Integer, Integer, YourClassC> table = HashBasedTable.create();
      table.put(0, 8, new YourClassC());
      table.put(1, 3, new YourClassC());
      table.put(2, 2, new YourClassC());
      ...
      
      table.get(0, 0); // returns null
      table.get(0, 8); // returns first instance of YourClassC
      

      【讨论】:

        【解决方案4】:

        我不确定我是否理解您的问题,因为您似乎在回答自己。答案取决于您希望如何将元素插入其中,以及您希望如何读取它们。

        以下是目前我能想到的一些方法,如果没有更多信息我无法选择:

        • 使用二维数组C[][],它可能包含空值。该解决方案需要从一开始就知道数组的大小。

        • 使用ArrayList&lt;ArrayList&lt;C&gt;&gt;,其中根列表是行列表,每行可能包含空项和C 对象。您可以根据需要添加更多行,并根据需要向一行添加更多元素。

        • 使用 2 ArrayList&lt;List&lt;C&gt;&gt;,其中第一个是行列表,第二个是列列表。行和列将共享相同的对象,但根本不需要包含任何空值:每一行只是该行中包含的非空对象的列表,每一列也是如此。

          最后一个解决方案不太容易操作,但如果您的矩阵非常稀疏(包含少量对象但包含大量行和列),则内存效率会更高。

        【讨论】:

          猜你喜欢
          • 2018-08-12
          • 2018-02-23
          • 2021-03-28
          • 1970-01-01
          • 2020-12-30
          • 2021-12-19
          • 2019-08-24
          • 1970-01-01
          • 2012-09-29
          相关资源
          最近更新 更多