【问题标题】:Out of bounds in an arraylist of arraylists数组列表的数组列表超出范围
【发布时间】:2016-10-05 11:33:54
【问题描述】:

每当我尝试向第一个内部数组添加一个元素时,它都会出现越界异常。我正在尝试创建一个二维数组列表来将名称存储在第一个插槽中,然后存储 30 个等级。我无法弄清楚如何向内部数组列表添加任何内容。错误被抛出 ((ArrayList)matrix.get(i)).set(0, nameIn);在那条线上。

import java.util.*;
/**
 * 
 * @author mitchell castaldini 
 * @version 5/5/2016
 */
public class gradebookTester
{
    public static void main(String args[])
    {
        Scanner in = new Scanner(System.in);
        /*List<List<String>> lists = new ArrayList<List<String>>();
        for(int i = 0; i < numNames;i++)
        {
            lists.add(new ArrayList<String>());
        }*/

        ArrayList matrix = new ArrayList();

        //matrix.add(row1);
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        matrix.add(new ArrayList());
        makeArrays(matrix);
    }
    private static void makeArrays(ArrayList matrix)
    {
        ArrayList row1 = new ArrayList();
        matrix.add(row1);
        Scanner in = new Scanner(System.in);
        int a = 2;

        for(int i = 0; i < a; i++)
        {
            System.out.println("Add name");
            String nameIn = in.next();
            row1.set(0, nameIn);
            //((ArrayList)matrix.get(i)).set(0, nameIn);
            for(int d = 0; d < 10;d++)
            {
                System.out.println("Add the " + (d+1) + " grade");
                int gradeIn = in.nextInt();

                ((ArrayList)matrix.get(i)).set(d, gradeIn);
            }
        }
    }
}

【问题讨论】:

  • 不要使用raw typesArrayList总是 表示您期望的元素类型,例如ArrayList&lt;String&gt;, ArrayList&lt;ArrayList&lt;String&gt;&gt;.
  • 我想你想要的是一个 Map>。
  • matrix.get(i).add(gradeIn); - 快速修复。缓慢修复:遵循@TheHeadRush 的建议
  • 我可以使用地图访问特定的插槽吗,因为这是我几天前遇到的问题@TheHeadRush

标签: java arraylist multidimensional-array


【解决方案1】:

查看ArrayList.set 方法的文档。您将看到它替换给定位置的元素。因为您的列表是空的,所以此时会引发错误。

此时您可以使用add 将该名称添加到列表中。

您的代码中存在严重缺陷,您应该明智地解决这些缺陷。您打算将字符串(姓名)和整数(成绩)存储在一个列表中。这几乎总是表明在单个集合中存储多个数据域的设计缺陷。

解决此问题的两个选项是:

  • 使用Map&lt;String,List&lt;Integer&gt;&gt; grades 存储您的成绩。然后使用grades.put(name, new ArrayList&lt;&gt;())grades.get(name).add(grade)

  • 最好定义一个StudentGrade 类来存储名称和成绩列表。然后,您可以使用List&lt;StudentGrade&gt;Map&lt;String,StudentGrade&gt;&gt; 来存储学生成绩列表。这将使您的代码更加清晰。

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多