如何使用2D ArrayList代替2D Array?

时间:2018-03-22 04:33:06

标签: java arraylist

我有一个程序可以读入文本文件,并使用逗号作为分隔符来标记单词。它工作正常,但现在我需要从使用二维数组切换到我知道有多少元素将使用二维ArrayList,因为我不知道将传递多少元素ArrayList。

这里是使用多维数组的工作代码,我真的只是想找到一种方法来改变下面的方法来使用ArrayList,这样我就可以将未知数量的元素传递给数组。

    String filename = "input.txt";
    File file = new File(filename);         
    Scanner sc = new Scanner(file);

    arraySize = sc.nextLine().trim();
    int size = Integer.parseInt(arraySize); 

    // creates a multidimensional array with the size set from the input file.
    String[][] myArray = new String[size][];

    // the outer for loop iterates through each line of the input file to populate the myArray.
    for (int i = 0; i < myArray.length; i++) {
         String line = sc.nextLine();  
         myArray[i] = line.split(","); //splits each comma separated element on the current line.
         //the inner for loop gets each element of myArray and removes any white space.
         for (int j = 0; j < myArray[i].length; j++) {
             myArray[i][j] = myArray[i][j].trim();
         }
    }

这是我一直在研究的,唯一的主要区别是该文件将有空格作为分隔符而不是逗号。并且它将从文件中读入未知数量的元素到数组中。 add()方法给了我以下错误。

The method add(int, List<String>) in the type List<List<String>> is not applicable for the arguments (String)

            String filename = "input.txt";
            File file = new File(filename);         
            Scanner sc = new Scanner(file);

//          ArrayList<ArrayList<String>> myArray = new ArrayList<ArrayList<String>>();
            List<List<String>> myArray = new ArrayList<>();

            while(sc.hasNextLine()) {
                 String line = sc.nextLine();  // each line will have an equation
                 String[] equations = line.split("\\s+");

                 for (String s : equations) {
                     s = s.trim();

                    // myArray.add(s); can't figure out how to add into arraylist

                 }                              

            }

            sc.close();  

编辑:我没有尝试将现有数组传递给ArrayList,只是试图找到一种方法来获取多维ArrayList来保存从中读取的未指定数量的元素输入文件中,输入文件中的每个单词需要使用空格作为分隔符进行分割,并存储在ArrayList中。

4 个答案:

答案 0 :(得分:1)

为文件中的每一行创建一个新的ArrayList对象。填充它并添加到容器ArrayList。

String filename = "input.txt";
        File file = new File(filename);         
        Scanner sc = new Scanner(file);

        List<List<String>> myArray = new ArrayList<>();

        while(sc.hasNextLine()) {
             String line = sc.nextLine();  // each line will have an equation
             String[] equations = line.split("\\s+");

             List<String> lineArray = new ArrayList<>();
             for (String s : equations) {
                 s = s.trim();
                 lineArray.add(s);
             }                              
             myArray.add(lineArray);
        }

        sc.close(); 

答案 1 :(得分:0)

  

将数组转换为ArrayList

您可以通过以下方式执行此操作:

Arrays.stream(equations).map(s -> s.trim()).collect(Collectors.toList());

修改

使用line.split("\\s+");,您已经将该行与一个或多个连续空格分开。所以你不必打电话给修剪。所以以下是一个简洁的版本。谢谢@shmosel。

Arrays.asList(equations);

答案 2 :(得分:0)

使用Files.lines它看起来像这样:

public static void main(String[] args) throws IOException {
    List<List<String>> words = new ArrayList<>();
    try(Stream<String> lines = Files.lines(Paths.get("input.txt"))) {
        lines.forEach(line -> words.add(Arrays.asList(line.split("\\s+"))));
    }
}

如果我们也使用Pattern.splitAsStream,那就会有点啰嗦,但我比Stream.forEach更喜欢它。从理论上讲,这种方法可以更有效:

public static void main(String[] args) throws IOException {
    List<List<String>> words;
    Pattern p = Pattern.compile("\\s+");
    try(Stream<String> lines = Files.lines(Paths.get("input.txt"))) {
        words = lines.map(s -> p.splitAsStream(s).collect(toList())).collect(toList());
    }
}

答案 3 :(得分:-1)

new ArrayList<>(Arrays.asList(array))

重复here