0

我已经到处寻找这个问题的答案,我还没有看到任何关于它的具体说明。

我已经编写了一个数组列表的数组列表,我需要递增所有子列表以获取列表中的所有其他元素。这与我到目前为止的情况一样接近:

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

int sz1=0; // how many questions in the new string array
int ctr=0; // increment through Question to set value of index

String [] Question = new String[sz1];

for(int x=0; x < list.size(); x++){

        sz1 = ((list.get(x).size() -1) / 2);


        for(int y=0; y < list.get(x).size(); y++){
            if ((y == 1) || (y % 2 == 1)){

                Question[ctr] = list.get(x).get(y); // throws Out of Bounds Exception: 0
                ctr++ // add 1 for the next index


            }
        }
    }

我认为这可能与内循环有关,但我几个小时都无法弄清楚。我猜问题是内循环调用的是大小而不是索引,但我不确定如何为二维数组列表更正它。

所以最终,我试图将父数组列表的每个子数组列表中的所有其他字符串存储到一个新的字符串数组中。

提前感谢您提供的任何帮助。

更新 非常感谢迄今为止的输入,这是我为此拥有的所有代码。为了尝试回答提出的一些问题,据我所知,该列表似乎正确填充。此外,“列表数组”的输入是一个文本文件。每个“类别”的第一行是类别名称,然后是问题和答案。每个类别由一个空行分隔。即:类别问题答案

新品类……

我已经弄清楚了所有这些,所以现在我需要在自己的数组列表中获取每个问题和答案(正如@icyitscold 指出的,谢谢),我试图通过只显示我正在处理的循环来保持简单,但它可能最好展示所有这些,这样你就可以看到发生了什么(正如@Dukeling 指出的那样。)。

所以这里是代码:

`public void Read_File() throws FileNotFoundException{

File infile = new File("trivia.txt");

    String line = "";

    Scanner sr = new Scanner(infile);
    int i=0;


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


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


    while (sr.hasNext()){
        i++;


        list.add(new ArrayList<String>());

        while (sr.hasNext()){       // Reads one whole category

            line = sr.nextLine();
            //System.out.println(line);

            if (line.length() == 0)
                {break;}

            list.get(i-1).add(line); // add line to the array list in that position

        }   
        System.out.println(list);

            }


    String [] catName  = new String[6];
for(int x=0; x < list.size(); x++){                 // category array
        catName[x] = list.get(x).get(0);}

    for(int x=0; x < list.size(); x++){             // questions array

        for(int y=0; y < list.get(x).size(); y++){
            if ((y == 1) || (y % 2 == 1)){
                question.add(list.get(x).get(y));   // throws OB of 0

            }
        }
    }

    System.out.println(question);

    sr.close(); 

}`
4

1 回答 1

1

我希望我能够正确理解您要查找的内容...您的代码片段存在一些问题。首先,您正在初始化您的“问题”数组,其大小为零 - 这导致了您的 Out of Bounds 异常 - 一旦您指定了数组的大小,就无法更改它。这就是为什么我在代码片段中使用 ArrayList 而不是 String[] 的原因。ArrayLists 更好,因为不必担心底层 Array 的尺寸,它会为您扩展。

另请注意我如何将名为“Question”的变量更改为“question”——在 java 中,变量名应以小写字母开头。根据Oracle 代码约定文档

除变量外,所有实例、类和类常量都是大小写混合,首字母小写

假设list正确填充,此代码应该可以工作:

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

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

for(int x=0; x < list.size(); x++){

        for(int y=0; y < list.get(x).size(); y++){
            if ((y == 1) || (y % 2 == 1)){

                question.add(list.get(x).get(y));

            }
        }
    }

结果questionArrayList 应该具有指定的每隔一个字符串。

于 2013-09-28T17:07:52.383 回答