尝试在Java中创建2D ArrayList

时间:2012-02-25 22:20:30

标签: java arraylist

我正在尝试阅读文件。我想将文件的内容存储在2D arraylist中,其中列表中的每个位置都包含一个字符。我想要它,以便原始文本文件中的每一行都是数组列表中的一行。例如,如果文本文件的输入是:

A,B,C

d,E,F

克,H,I

然后数组有望看起来像: {[A,B,C],[d,E,F],[G,H,I]}。不幸的是,目前我的结果只是[a,b,c,d,e,f,g,h,i]。 任何想法将不胜感激,我是Java新手。感谢。

import java.util.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Coursework1
{
    public static void main(String[] args)
    {
    try {
        List<String> list = new ArrayList<String>();

        String thisLine = null;
        BufferedReader br;
        br = new BufferedReader(new FileReader("map.txt"));

        while ((thisLine = br.readLine()) != null) {
        list.add(thisLine);
        }

        char[][] firstDimension = new char[list.size()][];
        for (int i = 0; i < list.size(); i++) {
        firstDimension[i] = list.get(i).toCharArray();
        }


        for (int i=0;i<firstDimension.length;i++) {
        for (int j=0;j<firstDimension[i].length;j++) {
            System.out.println(firstDimension[i][j]);
        }
        }

    } 
    catch (Exception e) {
        e.printStackTrace();
    }
    }
}

5 个答案:

答案 0 :(得分:2)

你的答案实际上是正确的并且功能齐全。您的测试代码是错误的,因为它会添加太多新行。

for (int i=0;i<firstDimension.length;i++) 
{
       System.out.println();
       for (int j=0;j<firstDimension[i].length;j++) 
       {
            System.out.print(firstDimension[i][j]);
       }
}

答案 1 :(得分:2)

您似乎没有完全理解数组和数组列表之间的区别。

数组是一个容器对象,它包含固定数量的单个类型的值。创建数组时,将建立数组的长度。创建后,其长度是固定的。因此,您必须在创建之前知道大小,或者必须创建足够大小的大小。

另一方面, ArrayList 是一个集合(复杂类型,请参阅this tutorial以获取更多信息),它可以容纳简单的对象,集合,... ArrayList可以想象为动态数组 - 您不必知道初始大小,如果您添加或删除元素,它会自动调整大小。

像这样迭代ArrayList是个好习惯

List<String> names = new ArrayList<String>();
// add something

// foreach loop
for (String name : names) {
    // here you have access directly to the value 
    // and you don't have to write list.get(index)
    System.out.println(name);
}

现在问你。如果您阅读上面的链接,您应该能够自己构建它。但如果你还是不知道:

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

使用foreach循环进行迭代

for (List<String> innerList : twoDimensionList) {
    for (String value : innerList) {
        ...
    }
}

答案 2 :(得分:1)

您可以在列表中嵌入列表,如:

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

然后访问你要做的元素,

matrix.get(1).get(2);

编辑:我还建议您考虑更多关于是否需要数组 ArrayList 。他们不一样。可以调整数组列表的大小(您可以继续在其上添加越来越多的元素,您不必强制在数组列表中只有这么多元素。这允许您执行诸如List<List<String>>对象之类的操作每个第二个维度都是相同的长度。另一方面,数组具有与之关联的特定大小,这将使您能够强制所有行具有相同的长度,并且所有列具有相同的高度...

答案 3 :(得分:0)

您的代码有效,您只是打印错误的结果。尝试:

        for (int i = 0; i < firstDimension.length; i++)
        {
            for (int j = 0; j < firstDimension[i].length; j++)
            {
                System.out.print(firstDimension[i][j]);
            }
            System.out.println();
        }

这打印同一行上的字符,同一行......

答案 4 :(得分:0)

每一行(String)已经是一个字符列表,其中的方法可以让你迭代它(length,charAt)。因此,根据您要实现的目标,字符串列表可能就足够了。