我有一个包含
的文本文件r0, 0.5, 1
r1, 0.6, -1
r2, 0.2, 1
我想读取文件并将每个列存储在java中的单独数组中。这是我写的代码。我只在记录中获取垃圾值。另外,我无法读取浮点值。请告诉我如何解决这个问题。
public class Model{
private String modelname ;
private String[] records ;
private int[] targets ;
private float[] scores ;
public Model(String name_model, String path) throws NumberFormatException, IOException {
this.modelname = path+name_model ;
System.out.println(this.modelname);
BufferedReader bufferReader = new BufferedReader(new FileReader(path+name_model));
String line=null;
int t=0;
while((line = bufferReader.readLine())!=null) {
System.out.println(line);
//String[] strar = line.split(",");
//String[] strar = line.split("\\s*,\\s*") ;
int k=1 ;
for(String part : line.split(",")) {
if (k==1) {
System.out.println(part.trim());
this.records[t] = part.trim() ;
}
if (k==3)
this.targets[t] = Integer.valueOf(part.trim()) ;
if (k==2)
this.scores[t] = Float.parseFloat(part.trim()) ;
k=k+1 ;
}
System.out.println(this.records[t] + " " + this.targets[t] + " " + this.scores[t]);
t=t+1;
}
}
public static void main(String[] args) throws Exception, IOException {
String s1, s2, s3 ;
s1 = "./direc/" ;
s2 = "file1.txt" ;
s3 = s1+s2 ;
System.out.println(s3);
new Model(s2, s1);
}
}
答案 0 :(得分:0)
如果您不在if (k==1)
案例中使用大括号,this.records[t]
将始终分配最后一部分。代码应该是:
if (k==1) {
System.out.println(part.trim());
this.records[t] = part.trim() ;
}
另外,在输入的第二行0.6后,你错过了一个逗号。
答案 1 :(得分:0)
您可以简化解析。您可以取消内循环并避免修剪为
String[] parts = line.split(", ");
this.records[t] = parts[0];
this.scores[t] = Float.parseFloat(parts[1]);
this.targets[t] = Integer.parseInt(parts[2]);
我假设你忘了把第二个逗号放在这里
r1, 0.6, -1
并且,由于您使用原始int[]
使用Integer.parseInt()
而不是Integer.valueOf()
(返回Integer
包装器)以避免不必要的拆箱。
编辑:
您还需要初始化所有数组,如
private String[] records = new String[100]; // initialization is MISSING!
因为在你的情况下,Array
的大小取决于输入数据文件中的行数,所以它需要是动态的。考虑切换到动态增长的ArrayList
。
private List<String> records = new ArrayList<String>();
private List<Integer> targets = new ArrayList<Integer>();
private List<Float> scores = new ArrayList<Float>();
因为,您需要使用包装器类型才能使用集合;切换回valueOf()
方法。
String[] parts = line.split(", ");
this.records.add(parts[0]);
this.scores.add(Float.valueOf(parts[1]));
this.targets.add(Integer.valueOf(parts[2]));
答案 2 :(得分:0)
我喜欢用于阅读文件的一种简单方法是使用扫描程序和文件类
首先导入那些 java.util.Scanner的; java.io *;
然后在你的代码中(不要忘记抛出IOException): 文件filename =新文件(“filename.txt”); 扫描仪fileScanner =新的扫描仪(文件名);
现在如果你使用数组,你需要知道数组的大小才能创建它,以及它的类型。
并考虑您的文本文件如下:
1.0 2.7 6.3 8.4 8.6
2.0 9.4 9.1 3.0 4.2
3.4 7.7 8.3 3.2 1.0
如果您的文件可以包含逗号 创建扫描仪后添加此行:
fileScanner.useDelimiter(", ")
你希望5个数组包含每一行浮点数或整数等... 创建5个大小的数组(此处为3),然后使用此循环添加每个数字:
int rank = 0;
double[] r1 = new double[3];
.
.
.
double[] r5 = new double[3];
while(fileScanner.hasNext())
{
if(fileScanner.hasNextDouble()) r1[rank] = fileScanner.nextDouble();
if(fileScanner.hasNextDouble()) r2[rank] = fileScanner.nextDouble();
if(fileScanner.hasNextDouble()) r3[rank] = fileScanner.nextDouble();
if(fileScanner.hasNextDouble()) r4[rank] = fileScanner.nextDouble();
if(fileScanner.hasNextDouble()) r5[rank] = fileScanner.nextDouble();
rank++;
}