java中的二维arraylists

时间:2010-12-21 20:29:00

标签: java arrays multidimensional-array

所以这是我正在处理一个项目的交易,该项目要求我拥有一维数组的二维arraylist。但每次我尝试加载我的数据时都会收到错误:

由于输入错误,无法执行此操作 java.lang.IndexOutOfBoundsException:Index:1,Size:0

在一些输入上。我不知道在这个问题上我哪里出错了。请帮助一点?

源代码:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JOptionPane;
import java.io.InputStream;


public class Facebull
{


    public static void main (String[] args) {

        if(args.length != 0){
            load(args[0]);

        }
        else{
            load("testFile");
        }

    }

    public static void load(String fname) {
        int costOfMach = 0;
        ArrayList <Integer> finalMach = new ArrayList<Integer>();
        ArrayList <ArrayList<int[]>>machines = new ArrayList<ArrayList<int[]>>();

        Scanner inputFile = null;

        File f = new File(fname);

        if (f.exists ())
        {

            try
            {
                inputFile = new Scanner (f);

            }

            catch (FileNotFoundException e)
            {
                JOptionPane.showMessageDialog(null,"Can't find the file\n" + e);
            }

            int i = 0;


            while (inputFile.hasNext ( ))
            {

                String str = inputFile.nextLine ( );

                String [ ] fields = str.split ("[\t ]");

                System.out.println(str);

                if (!(fields[0].isEmpty() || fields[0].equals (""))){

                    fields[0] = fields[0].substring(1);
                    fields[1] = fields[1].substring(1);
                    fields[2] = fields[2].substring(1);

                    try
                    {   
                        //data to be inputed is 0 and 3 location of data is 1 and 2
                        int[] item = new int[2];
                        item[1] = Integer.parseInt(fields[0]);
                        item[0] = Integer.parseInt(fields[3]);

                        if(machines.size() < Integer.parseInt(fields[1])){
                            ArrayList<int[]> column = new ArrayList<int[]>();
                            machines.add (Integer.parseInt(fields[1])-1, column);
                            System.out.println("we're in the if");
                        }
                        machines.get(Integer.parseInt(fields[1])-1).add(Integer.parseInt(fields[2])-1, item);

                    }
                    //catches any exception 
                    catch (Exception e)
                    {
                        System.out.println("Can't do this opperation because of bad input \n" + e);
                    }

                }

            }
            inputFile.close ( );
        }
        System.out.print(machines);

    }//end load
}

2 个答案:

答案 0 :(得分:0)

下面:

machines.add(Integer.parseInt(fields[1])-1, column);

您没有在任何地方指定机器ArrayList的大小。当您使用add的单参数版本时,ArrayList将动态增长,因为它会添加到列表的末尾,但是当使用双参数版本时,ArrayList必须至少与您指定的索引一样长。由于您没有指定大小,并且您没有在任何地方使用单参数添加,因此您的ArrayList的大小为0,因此无论您提供什么索引,它都将超出范围。您可以在创建ArrayList实例时指定大小,也可以在调用add之前使用ArrayList.ensureCapacity。

然后你在get行中遇到了同样的问题,尝试在空ArrayList上使用双参数add。

答案 1 :(得分:0)

如下所示为2D ArrayList声明ArrayList:

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

现在在索引0处添加一个新的String ArrayList:

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

现在,在索引0处输入新的ArrayList,因此您必须向该特定ArrayList添加值,如下所示:

my2DarrayList.get(0).add("String is added here");