这里我书店最后一部分的说明是:
通过Bookstore类的read()方法,可以阅读有关发布者和书籍的信息,并将其存储在相应的集合中。此方法接收文件路径作为参数。该文件是按字段排列的文本,由字段分隔,&#39 ;;'。 每行包含有关出版商或图书的信息,如果第一个字段包含字母" P"或" B"分别。 发布商行在第一个后面包含字段名称,平均递送和电子邮件。 在第一个之后,书籍行包含字段标题,作者,年份,价格,出版商名称和数量。 该方法必须忽略不符合此描述模式的行。 <
这里是我创建的代码:
public void read(String dir) throws IOException, FileNotFoundException {
String s;
String name="", del="", email="";
int delivery=0;
String author="", title="", publisher="", yr="", qnt="", prc="";
int year=0, quantity=0;
double price=0.0;
int ch = 0;
BufferedReader br = new BufferedReader(new FileReader(dir));
while((s=br.readLine())!=null){
// Here I know I should put more conditions but I can't define in my mind "field" in a right way.
if((s.charAt(0)!='P' && s.charAt(1)!=';') || (s.charAt(0)!='B' && s.charAt(1)!=';'))
System.out.println("Line not conform");
else if((s.charAt(0)=='P') && (s.charAt(1)==';')){
for(int i=2; s.charAt(i)!=';'; i++){
name += s.charAt(i);
ch = i+2;
}
for(int i=ch; s.charAt(i)!=';'; i++){
del += s.charAt(i);
delivery = Integer.parseInt(del);
ch = i+2;
}
for(int i=ch; i<s.length(); i++){
email += s.charAt(i);
}
publishers.add(new Publisher(name, delivery, email));
name=""; del=""; email="";
ch=0; delivery=0;
} else if((s.charAt(0)=='B') && (s.charAt(1)==';')){
for(int i=2; s.charAt(i)!=';'; i++){
title += s.charAt(i);
ch = i+2;
}
for(int i=ch; s.charAt(i)!=';'; i++){
author += s.charAt(i);
ch = i+2;
}
for(int i=ch; s.charAt(i)!=';'; i++){
yr += s.charAt(i);
year = Integer.parseInt(yr);
ch = i+2;
}
for(int i=ch; s.charAt(i)!=';'; i++){
prc += s.charAt(i);
price = Double.parseDouble(prc);
ch = i+2;
}
for(int i=ch; s.charAt(i)!=';'; i++){
publisher += s.charAt(i);
ch = i+2;
}
for(int i=ch; i<s.length(); i++){
qnt += s.charAt(i);
quantity = Integer.parseInt(qnt);
}
Book book=null;
for(int i=0; i<publishers.size(); i++){
if(publisher.equals(publishers.get(i).getName())){
book = new Book(title, author, year, price, publisher);
books.add(book);
}
}
libro.setQuantity(quantity);
author=""; title=""; publisher=""; prc=""; yr=""; qnt="";
ch=0; year=0; price=0; quantity=0;
}
}
}
就我而言,我可以正确存储出版商和书籍,但后来我没有通过最后一次测试,因为我不知道如何用正确的代码表达字段的概念。 有人可以帮帮我吗?
此外,我确信有一种更简单的方法可以写出我写的内容,但在我看来这是目前最好的解决方案。
感谢Aeshang,我能够修改和更正我的代码,现在一切正常! 还有一件事:如果有办法可以帮助我简化它吗?
public void leggi(String dir) throws IOException, FileNotFoundException {
String s;
String name="", del="", email="";
int delivery=0;
String author="", title="", publisher="", yr="", qnt="", prc="";
int year=0, quantity=0;
double price=0.0;
BufferedReader br = new BufferedReader(new FileReader(dir));
while((s=br.readLine())!=null){
boolean isOk=true;
String[] splitted = s.split(";");
if((splitted.length!=7 && splitted.length!=4) || (!splitted[0].equals("E") && !splitted[0].equals("L")))
System.out.println("Line not conform");
else if(splitted[0].equals("E")){
name=splitted[1];
if(splitted[2].startsWith("0")||splitted[2].startsWith("1")||splitted[2].startsWith("2")||
splitted[2].startsWith("3")||splitted[2].startsWith("4")||splitted[2].startsWith("5")||
splitted[2].startsWith("6")||splitted[2].startsWith("7")||splitted[2].startsWith("8")||
splitted[2].startsWith("9")){
del=splitted[2];
delivery=Integer.parseInt(del);
} else isOk=false;
email=splitted[3];
if(isOk==true){
publishers.add(new Publisher(name, delivery, email));
name=""; del=""; email=""; delivery=0;
} else System.out.println("Line not conform");
} else if(splitted[0].equals("L")){
title=splitted[1];
author=splitted[2];
if(splitted[3].startsWith("0")||splitted[3].startsWith("1")||splitted[3].startsWith("2")||
splitted[3].startsWith("3")||splitted[3].startsWith("4")||splitted[3].startsWith("5")||
splitted[3].startsWith("6")||splitted[3].startsWith("7")||splitted[3].startsWith("8")||
splitted[3].startsWith("9")){
yr=splitted[3];
year=Integer.parseInt(yr);
} else isOk=false;
if(splitted[4].startsWith("0")||splitted[4].startsWith("1")||splitted[4].startsWith("2")||
splitted[4].startsWith("3")||splitted[4].startsWith("4")||splitted[4].startsWith("5")||
splitted[4].startsWith("6")||splitted[4].startsWith("7")||splitted[4].startsWith("8")||
splitted[4].startsWith("9")){
prc=splitted[4];
price=Double.parseDouble(prc);
} else isOk=false;
publisher=splitted[5];
if(splitted[6].startsWith("0")||splitted[6].startsWith("1")||splitted[6].startsWith("2")||
splitted[6].startsWith("3")||splitted[6].startsWith("4")||splitted[6].startsWith("5")||
splitted[6].startsWith("6")||splitted[6].startsWith("7")||splitted[6].startsWith("8")||
splitted[6].startsWith("9")){
qnt=splitted[6];
quantityt=Integer.parseInt(qnt);
} else isOk=false;
if(isOk==true){
Book book=null;
book = new Book(title, author, year, price, publisher);
books.add(book);
book.setQuantity(quantity);
author=""; title=""; publisher=""; prc=""; yr=""; qnt="";
year=0; price=0; quantity=0;
} else System.out.println("Line not conform");
}
}
}
答案 0 :(得分:2)
你听说过拆弦吗?请使用以下语法
String[] splitedString = s.split(";");
然后循环中的代码可以像这样改变
String[] splitedString = s.split(";");
if(splitedString[0].length==1 && !(splitedString[0].equalsIgnoreCase("p") || splitedString[0].equalsIgnoreCase("b"))) {
System.out.println("Line not conform");
} else if(splitedString[0].equalsIgnoreCase(p) && splitedString.length==5) {
name = splitedString[1];
average = splitedString[2];
delivery = splitedString[3];
email = splitedString[4];
}
依旧......
编辑:
对于所有你解析int&amp;解析双请改变它们。保持简单,删除所有代码,包括if检查,它们应该像
一样简单try {
delivery=Integer.parseInt(splitted[2].trim());
} catch (NumberFormatException) {
isOk=false;
}