如何从文本文件填充多维ArrayList(Java)?
我想创建一个动态多维ArrayList,它从一个文本文件中读取整数,这些整数由空格和类似以下内容的行分隔:如何从文本文件填充多维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
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解析为一个整数
//将其添加到您的列表中
}
回报率