所以我环顾四周,找不到与我想要完成的任何事情有关的任何事情,所以我在这里问你们有些人,如果你们是我会帮忙的。我是一名大学生,我正在努力绕过一项特殊的任务。
任务围绕以下内容进行:
我目前正在使用Scanner扫描文件,而.split则在找到的每个连字符处拆分文本,然后将该数据放入String [] splitText数组中......代码如下:
File Fileobject = new File(importFile);
Scanner fileReader = new Scanner(Fileobject);
while(fileReader.hasNext())
{
String line = fileReader.nextLine();
String[] splitText = line.split("-");
}
我们正在扫描的文件中包含的文字格式如下:
Title - Author - Price - Publisher - ISBN
标题,作者和出版商的长度各不相同 - 而ISBN是11个字符,价格是两位小数。我能够轻松地将有效数据打印到控制台,尽管它有整个验证和打印错误(例如:"书名可能丢失。")到我的控制台头扭曲。
IF语句是否适合检查每行数据?如果是这样,那将如何构建?
答案 0 :(得分:0)
是的,你最好的选择是使用if语句(我想不出另一种方式?)。为了清洁,我建议您创建validateData(String data)方法或多个验证器函数。
例如,因为您知道每一行都将采用标题 - 作者 - 价格 - 出版商 - ISBN格式,您可以编写如下代码:
public void validatePrice(String data) {
//Write your logic to validate.
}
public void validateAuthor(String data) {
//Write your logic to validate.
}
...
然后在你的while循环中你可以调用
validatePrice([splitText[0]);
validateAuthor([splitText[1]);
用于每个验证方法。
根据您的需要,您可以将此更多的OOP风格转变,但这是一种清晰的方式。
答案 1 :(得分:0)
如果要检查五列中每一列的长度/存在,请考虑以下事项:
while (fileReader.hasNext()) {
String line = fileReader.nextLine();
String[] splitText = line.split("-");
if (splitText.length < 5) {
System.out.println("One or more columns is entirely missing.");
continue; // skip this line
}
if (splitText[0].length == 0) {
System.out.println("Title is missing")
}
if (splitText[1].length == 0) {
System.out.println("Author is missing")
}
boolean isValidPrice = true;
try {
Double.parseDouble(splitText[2]);
}
catch (Exception e) {
isValidPrice = false;
}
if (!isValidPrice) {
System.out.println("Found an invalid price " + splitText[2] + " but expected a decimal.");
}
if (splitText[4].length != 11) {
System.out.println("Found an invalid ISBN.");
}
我上面做了两级验证。如果在破折号上拆分当前行不会产生5个术语,那么我们缺少列,我们甚至不会猜测实际上可能存在哪些数据。如果有5个预期列,那么我们按长度和/或预期值对每个字段进行验证。
答案 2 :(得分:0)
您要检查验证的第一件事是您有适当数量的条目(在这种情况下检查数组的大小是否为5),之后,您要检查每个数据
如果陈述是一个好方法,你可以做一些简单的事情:
if(title.isBad()) print("error");
if(author.isBad()) print("error");
if(price.isBad()) print("error");
if(publisher.isBad()) print("error");
if(isbn.isBad()) print("error");
替换正在检查的子句的.isBad,例如string [i] .isEmpty(),ISBN的长度等。
对于需要更长时间检查的产品,例如价格,您将要制作一些嵌套的for循环,检查它是否包含句点,仅包含数字,并且&#39; y后有2位数字期间。
有用的东西是原始数据类型的Wrapper类,如果允许你这样做
Character.isLetter(strings[i].charAt[j])
代替
(strings[i].charAt[j] >= 'A' && strings[i].charAt[j] <= 'Z') &&
(strings[i].charAt[j] >= 'a' && strings[i].charAt[j] <= 'z')
和
try{
Double.parseDouble(strings[i]);
}
而不是手动检查价格。
希望这有帮助!