我想创建一个动态多维数组列表,它从一个文本文件中读取整数,用空格分隔,用行看起来像这样:
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());
}
这几乎是我的第二个学期,任何接触过编程,因此,如果我应该使用不同的数据结构等,任何关于这是否可行,有效,低效的答案/建议将不胜感激。
答案 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的来源。祝其余的功课好运。