我正在尝试创建一个程序,该程序可以读取文本文件并根据数据(以及其他内容)创建对象的arraylist。大多数文本非常直接,由两个双数组成,如下所示:
454.56 3.4
3321.7 .0023
但是,一些文本行最后缺少一个数字,只包含一个这样的双数:
3222.5
这是我到目前为止的代码的简化版本:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
public class objectGenerator {
public double firstDouble;
public double secondDouble;
objectGenerator(double 1, double 2) {
firstDouble = 1;
secondDouble = 2;
}
public static void main(String[] args) {
String fileName = "data.txt";
Scanner inputStream = null;
try {
inputStream = new Scanner(new File(fileName));
} catch (FileNotFoundException e) {
System.out.println("Error opening the file " +
fileName);
System.exit(0);
}
List<objectGenerator> objects = new ArrayList<objectGenerator>();
while (inputStream.hasNextLine()) {
String line = inputStream.nextLine();
String[] data = line.split(" ");
objectGenerator object = new objectGenerator(Double.parseDouble(data[0]), Double.parseDouble(data[1]));
objects.add(object);
}
inputStream.close();
//example text file
//544.7 7.4
//34.5
}
}
运行以下代码将产生错误消息,因为文本文件在第二行末尾缺少double。我不确定如何解决这个问题,并感谢我能得到的任何帮助。
作为旁注,如果有一些方法可以让我在填充arraylist时填写文本文件留下的空白区域的默认值,这将是非常有益的。我将使用的最终文本文件可能包含数百行代码,因此如果在创建对象时有一种方法为所有空格填充默认值,那将会很好。
答案 0 :(得分:1)
以下是重构while
循环的方法:
static final double DEFAULT_DATA = -1d; // replace with your desired default value
while (inputStream.hasNextLine()) {
String line = inputStream.nextLine();
String[] data = line.split(" ");
objectGenerator object = null;
if (data.length == 1 && data[0].equals("")) { // empty line
object = new objectGenerator(DEFAULT_DATA, DEFAULT_DATA);
}
else if (data.length == 1) { // only one number
object = new objectGenerator(Double.parseDouble(data[0]), DEFAULT_DATA);
}
else { // two numbers
object = new objectGenerator(Double.parseDouble(data[0]),
Double.parseDouble(data[1]));
}
// you may want to check if (object == null) here to cover any weird edge cases
objects.add(object);
}
顺便说一下,Java命名约定规定类名的第一个字母应该出现在大写中。因此,我会将您的班级名称更改为ObjectGenerator
,并使用大写O
。
答案 1 :(得分:0)
为您的objectGenerator
objectGenerator(double a){
this(a, 0);
}
objectGenerator(double a, double b){
firstDouble = a;
secondDouble = b;
}
我假设如果在文本文件中找不到secondDouble
值为零
现在您可以像这样创建objectGenerator
:
objectGenerator object = new data.length == 1 ? objectGenerator(Double.parseDouble(data[0])) : new objectGenerator(Double.parseDouble(data[0]),Double.parseDouble(data[1])) ;
如果您使用的是java 8
您可以使用可变参数
objectGenerator(double...arr){
firstDouble = arr[0];
secondDouble = arr.length > 1 ? arr[1] : 0;
}