如何从文本文件中填充多维ArrayList(Java)?

时间:2012-01-22 19:26:04

标签: java multidimensional-array arraylist

我想创建一个动态多维数组列表,它从一个文本文件中读取整数,用空格分隔,用行看起来像这样:

0 -5 5 0 -3 0 5
3 1 0 0 0 0 5
5 -5 0 5 5 1 1

(只是实际数据的一小部分,行和列可能会发生变化,因此需要动态的2D ArrayList。)

到目前为止,这就是我在代码中所拥有的:

ArrayList<ArrayList<Integer>> ratings2DArray = new ArrayList<ArrayList<Integer>>();
try {
in = new BufferedReader(new FileReader("PureRatings.txt"));
        int counter = 0;

        while (in.readLine() != null) {
            ratings2DArray.add(new ArrayList<Integer>()); //Adds 2nd dimension. 

^几乎可以说,对于文本文件中的每一行,都要在2D ArrayList中添加一行。

在这里,我需要声明一个名为rating的字符串(或char?)变量,它接受来自文本文件的输入。 并将它用空格分隔(对不起,如果我没有正确使用术语),以便每个字符“-5”,“ - 3”,“0”,“3”,“5”分别放在ArrayList中。

            ratings2DArray.get(counter).add(Integer.parseInt(rating));
            counter ++;
        }

        in.close();

    } catch (IOException e) {
        System.out.println(e.getMessage());
    }

这几乎是我的第二个学期,任何接触过编程,因此,如果我应该使用不同的数据结构等,任何关于这是否可行,有效,低效的答案/建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

  • 使用接下来的方法是可行的
  • 在数据结构设计方面,请尝试使用List interface,如:

    List<List<Integer>> ratings2DArray = new ArrayList<ArrayList<Integer>>();

    原因是明天你可以将ArrayList更改为其他内容。

  • 关于效率,您的soln在您的需求性质方面相当有效。如果有人真的要挤出更多性能,那么代码可能就不那么可读了。一个性能解决方案我认为(在我的头顶),假设没有。列是整个文件的const,是摆脱第二/嵌套ArrayList并用固定大小的int数组替换它。

    要确定列数,我们可以使用文件中的第一行作为参考。


根据以下评论详细阐述优化问题。

所以你说的是Column represent Book(每列都是不同的书),行代表customer(每行都是不同的客户)......

假设我选择-100作为未评级书籍的值(为清晰起见,数据中有额外的空格)

           Book1 Book2 Book3 Book4
Customer1  -100   5      5      3
Customer2    0    3      2    -100

现在,当我正在读取文件时,给定文件的列数是固定的,我们可以从第一行确定。

说出书'Book5`已被添加。

           Book1 Book2 Book3 Book4 Book5
Customer1  -100   5      5      3   -100
Customer2    0    3      2    -100  -100

说客户'Customer3`已添加。

           Book1 Book2 Book3 Book4 
Customer1  -100   5      5      3 
Customer2    0    3      2    -100
Customer3  -100  -100  -100   -100

所以在这两种情况下,阅读第一行都告诉我们没有。列和它们保持文件的const。


现在,如果想要在内存List中添加内容,那么上面的soln就不是很优化了。因为每次更新都必须调整阵列的大小。优化通常针对特定用例。

因此,对于内存中添加数据,我认为您当前的解决方案会很好。只有你可以做的是将no的列传递给ArrayList创建,如:

// We are telling ArrayList the expected data size
// You can choose noOfColumns + some value according to ur need
// It will expand if more is needed
ratings2DArray.add(new ArrayList<Integer>(noOfColumns));
加载文件时

。这种方式ArrayList简洁明了,性能会更好。

答案 1 :(得分:2)

你朝着正确的方向前进。记住要始终将代码组织成逻辑单元,这有助于概念化过程,以及维护您的程序。

public List<List<Integer>> parseRatingsFile(String fileName) throws IOException {
    List<List<Integer>> ratings2DArray = new ArrayList<List<Integer>>(16);

    final BufferedReader in = new BufferedReader(new FileReader(fileName));
    String ratingsLine = null;
    while ((ratingsLine = in.readLine()) != null) {
        ratings2DArray.add(parseRatingsLine(ratingsLine));
    }
    in.close();

    return ratings2DArray;
}

public List<Integer> parseRatingsLine(String ratingsLine) IOException {
    List<Integer> ratings = new ArrayList<Integer>(8);
    if(ratingsLine == null) return ratings;

    String[] ratingsStrArr = ratingsLine.split(" "); // Tokenize on 'space' character
    for(final String ratingStr: ratingsStrArr) {
        // Here you would parse the ratingStr as an Integer, and
        // add it to your list
    }

    return ratings;
}

您应该处理在解析单个整数时可能出现的NumberFormatExceptions。你会注意到我删除了counter变量,它使你的程序更复杂,可能是bug的来源。祝其余的功课好运。