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

如何从文本文件填充多维ArrayList(Java)?,java,multidimensional-array,arraylist,Java,Multidimensional Array,Arraylist,我想创建一个动态多维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<Inte

我想创建一个动态多维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. 
这仅仅是我接触编程的第二个学期,因此,如果我使用不同的数据结构等等,对于这是否可行、高效、低效的回答/建议,我将不胜感激

  • 你所采用的方法是可行的
  • 在数据结构设计方面,尝试使用
    列表界面
    如下:

    List ratings2DArray=new ArrayList()

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

  • 关于效率,您的soln在您的需求性质方面相当有效。如果有人真的需要压缩更多的性能,那么代码可能就没有那么可读性。我认为(在我看来)一个性能解决方案是,假设整个文件的列数都是常量,去掉第二个/嵌套的
    ArrayList
    ,用固定大小的
    int
    数组替换它

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


基于以下评论对优化方案进行详细阐述

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

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

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

假设添加了book“Book5”

           Book1 Book2 Book3 Book4 Book5
Customer1  -100   5      5      3   -100
Customer2    0    3      2    -100  -100
           Book1 Book2 Book3 Book4 
Customer1  -100   5      5      3 
Customer2    0    3      2    -100
Customer3  -100  -100  -100   -100
添加了客户“Customer3”

           Book1 Book2 Book3 Book4 Book5
Customer1  -100   5      5      3   -100
Customer2    0    3      2    -100  -100
           Book1 Book2 Book3 Book4 
Customer1  -100   5      5      3 
Customer2    0    3      2    -100
Customer3  -100  -100  -100   -100
因此,在这两种情况下,读取第一行告诉我们列的数量,并且它们对于文件保持常量


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

所以对于内存中的数据添加,我认为您当前的soln会做得很好。您只能将列数传递给
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预期的数据大小
//您可以根据需要选择noOfColumns+一些值
//如果需要更多,它将扩大
ratings2DArray.add(新数组列表(noOfColumns));
加载文件时。这种方式
ArrayList
简洁且性能更好。

  • 你所采用的方法是可行的
  • 在数据结构设计方面,尝试使用
    列表界面
    如下:

    List ratings2DArray=new ArrayList()

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

  • 关于效率,您的soln在您的需求性质方面相当有效。如果有人真的需要压缩更多的性能,那么代码可能就没有那么可读性。我认为(在我看来)一个性能解决方案是,假设整个文件的列数都是常量,去掉第二个/嵌套的
    ArrayList
    ,用固定大小的
    int
    数组替换它

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


基于以下评论对优化方案进行详细阐述

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

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

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

假设添加了book“Book5”

           Book1 Book2 Book3 Book4 Book5
Customer1  -100   5      5      3   -100
Customer2    0    3      2    -100  -100
           Book1 Book2 Book3 Book4 
Customer1  -100   5      5      3 
Customer2    0    3      2    -100
Customer3  -100  -100  -100   -100
添加了客户“Customer3”

           Book1 Book2 Book3 Book4 Book5
Customer1  -100   5      5      3   -100
Customer2    0    3      2    -100  -100
           Book1 Book2 Book3 Book4 
Customer1  -100   5      5      3 
Customer2    0    3      2    -100
Customer3  -100  -100  -100   -100
因此,在这两种情况下,读取第一行告诉我们列的数量,并且它们对于文件保持常量


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

所以对于内存中的数据添加,我认为您当前的soln会做得很好。您只能将列数传递给
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预期的数据大小
//您可以根据需要选择noOfColumns+一些值
//如果需要更多,它将扩大
ratings2DArray.add(新数组列表(noOfColumns));

加载文件时。这种方式
ArrayList
简洁,性能会更好。

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

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;
}
公共列表解析文件(字符串文件名)引发IOException{
列表比率2 Darray=新阵列列表(16);
final BufferedReader in=new BufferedReader(new FileReader(fileName));
字符串比率sline=null;
而((ratingsLine=in.readLine())!=null){
ratings2DArray.add(parseRatingsLine(ratingsLine));
}
in.close();
回报率2 Darray;
}
公共列表parseRatingsLine(字符串ratingsLine)IOException{
列表评级=新的ArrayList(8);
如果(评级SLINE==null)返回评级;
String[]ratingsStrArr=ratingsLine.split(“”;//在“空格”字符上标记化
用于(最终字符串额定值STR:ratingsStrArr){
//在这里,您可以将ratingStr解析为一个整数
//将其添加到您的列表中
}
回报率