我想将特定值从文本文件复制到Java Application中的Arraylist。这是我的文本文件(作为test.text存储在我的桌面中)
String name = carrot;
double unit_price = 200;
int unit = 10;
这个值我想存储在Arraylist中,它存在于我的主应用程序中,如下所示:
package com.main;
import com.collection.Ingridient;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
public class FileReaderApp {
public static void main(String[] args) throws FileNotFoundException, IOException {
Ingridient i_one = new Ingridient();
ArrayList<Ingridient> db = new ArrayList<Ingridient>();
FileReader fin = new FileReader("/home/yati/Desktop/test");
Scanner src = new Scanner(fin);
// Read the ingridient from text file.
while (src.hasNext()) {
if (src.hasNext()) {
i_one.setName(src.next());
System.out.println("Name: " +src.next());
} else
if(src.hasNextDouble()) {
i_one.setUnit_price(src.nextDouble());
System.out.println("Unit Price: " +src.nextDouble());
}
else if (src.hasNextInt()) {
i_one.setUnit(src.nextInt());
System.out.println("Unit: " +src.nextInt());
} else {
System.out.println("File format error.");
return;
}
db.add(i_one);
}
fin.close();
}
}
她,Ingridient类有以下代码:
package com.collection;
public class Ingridient {
String name;
Double unit_price;
int unit;
public Ingridient() {
name = null;
unit_price = null;
unit = 0;
}
public void setName(String name) {
this.name = name;
}
public void setUnit_price(Double unit_price) {
this.unit_price = unit_price;
}
public void setUnit(int unit) {
this.unit = unit;
}
}
我的问题是我的应用程序只能在Ingridient对象中存储名称,并且它不能在unit和unit_price中存储任何值。获得的输出是: 我知道我在某个地方有误,但我无法解决这个问题。有什么建议吗?
答案 0 :(得分:1)
这应该这样做:
public static void main(String[] args) throws IOException {
String content = "String name = carrot;\ndouble unit_price = 200;\nint unit = 10;";
try (Scanner sc = new Scanner(content)) {
sc.useDelimiter("(;*\n*.+ .+ = )|;");
List<Incredient> incredients = new ArrayList<>();
while (true) {
Incrediend incredient = new Incredient();
if (sc.hasNext()) {
String name = sc.next();
incredient.setName(name);
System.out.println("Name: " + name);
} else {
break;
}
if (sc.hasNextDouble()) {
double unitPrice = sc.nextDouble();
incredient.setUnit_price(unitPrice);
System.out.println("Unit Price: " + unitPrice);
} else {
break;
}
if (sc.hasNextInt()) {
int unit = sc.nextInt();
incredient.setUnit(unit);
System.out.println("Unit: " + unit);
} else {
break;
}
incredients.add(incredient);
}
} catch (Exception e) {
e.printStackTrace();
}
}
这是因为我使用了(;*\n*.+ .+ = )|;
的分隔符。
这个正则表达式只会删除您不想保存的文本文件的所有部分。
您的方法存在一些问题,例如:
i_one.setName(src.next());
System.out.println("Name: " +src.next());
在这里,您从扫描仪中读取2个令牌,因为有next()
的2次调用,如果您想为多个事项使用相同的令牌,则应创建一个新变量来存储它(例如:String name = sc.next()
)。
Scanner
使用的默认分隔符是单个空格,因此,在您的代码中,hasNextDouble()
和hasNextInt()
将永远不会为真,文本中的所有数字文件以;
结尾。
我不确定你在这里尝试做什么,从文本文件解析java代码有点不寻常。如果您可以更改文本文件的格式,则应选择一个更易于解析的格式(例如CSV)。
答案 1 :(得分:0)
src.hasNext()选择您文件中的每一行,因此它永远不会跳转到if / else条件之一 我还建议使用json作为输入格式;)
答案 2 :(得分:0)
{{1}}
它始终是真的,而另一个其他{}部分则无法使用
答案 3 :(得分:0)
你的第一个if条件是错误的,以获得你需要的输出......
if(src.hasNext())
如果条件永远不会执行,则此条件将始终满足,因为将存在下一个对象和您的后续其他对象。这可以在输出中看到始终在第一个if条件下从 sysout 打印数据。
我已将代码更改为使用字符串类给出的 startsWith 方法。希望它有所帮助...
注意:在解析之前请确保删除这些特殊字符(如果有)。 (半殖民地等)
while (src.hasNext()) {
String input = src.next();
if (input.startsWith("name")) {
i_one.setName(input);
System.out.println("Name: " + input);
} else if (input.startsWith("unit_price")) {
i_one.setUnit_price(Double.parseDouble(input));
System.out.println("Unit Price: " + input);
} else if (input.startsWith("unit")) {
i_one.setUnit(Integer.parseInt(input));
System.out.println("Unit : " + input);
} else {
System.out.println("File format error.");
return;
}
db.add(i_one);
}
答案 4 :(得分:0)
文本文件的结构不太适合解析所需的值。
如果你能够将它改为
carrot,200,10
因此,在一行中具有所需成分的所有值。将此行拆分为“,”将为您提供实例化对象所需的所有值。
如果您无法更改文本格式(因为它是任务的一部分),您应该阅读文本文件的整行并解释它们的三元组以获取对象。所以你也可以确定你需要的所有值都在那里。
答案 5 :(得分:0)
如果文本文件的结构始终相同,则可以使用字符串类的contains方法。例如:
public class FileReaderApp {
public static void main(String[] args) throws FileNotFoundException, IOException {
Ingridient i_one = new Ingridient();
ArrayList<Ingridient> db = new ArrayList<Ingridient>();
try(BufferedReader br = new BufferedReader(new FileReader("/home/yati/Desktop/test.txt"))) {
String line ;
while ((line = br.readLine())!=null) {
String [] splited;
if(line.contains("String name")){
splited= line.split(" ");
i_one.setName(splited[splited.length-1].replace(";", ""));
System.out.println(i_one.name);
}
else if(line.contains("double unit_price")){
splited= line.split(" ");
i_one.setUnit_price(Double.parseDouble(splited[splited.length-1].replace(";", "")));
System.out.println(i_one.unit_price);
}
else if(line.contains("int unit")){
splited= line.split(" ");
i_one.setUnit(Integer.parseInt(splited[splited.length-1].replace(";", "")));
System.out.println(i_one.unit);
}
}
}
db.add(i_one);
}
}