Java 如何将对象从csv添加和打印到arrayList
我试图将从CSV文件读取的产品添加到ArrayList中,并为每个产品创建一个对象。但是当我尝试使用for-each循环打印ArrayList时,我会一直得到最后一个元素,在这种情况下,我得到了三次TV 我的csv文件: 汽车,20000 表,150 电视,250 我的产品类别:Java 如何将对象从csv添加和打印到arrayList,java,csv,object,arraylist,Java,Csv,Object,Arraylist,我试图将从CSV文件读取的产品添加到ArrayList中,并为每个产品创建一个对象。但是当我尝试使用for-each循环打印ArrayList时,我会一直得到最后一个元素,在这种情况下,我得到了三次TV 我的csv文件: 汽车,20000 表,150 电视,250 我的产品类别: import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayL
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class product {
private static String Name;
private static double Price;
public static List<product> List_product = new ArrayList<>();
public static void readPrice() throws IOException {
FileReader info = new FileReader("info.csv");
BufferedReader reader = new BufferedReader(info);
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
String[] attributes = line.split(",");
double price = Double.parseDouble(attributes[1]);
List_product.add(new product(attributes[0], price));
}
reader.close();
}
public product(String Name, double Price) {
product.Name = Name;
product.Price = Price;
}
public String getName() {
return Name;
}
public double getPrice() {
return Price;
}
public static List<product> getList() {
return List_product;
}
}
试试这个,
主类
试一试{
Product.readPrice();
对于(产品:Product.getList()){
System.out.println(product.getName()+“--”+product.getPrice());
}
}捕获(IOE异常){
}
公共类产品{
私有字符串名称;
私人双价;
public static List listProduct=new ArrayList();
public static void readPrice()引发IOException{
FileReader info=新的FileReader(“info.csv”);
BufferedReader reader=新的BufferedReader(信息);
虽然(正确){
字符串行=reader.readLine();
如果(line==null){
打破
}
String[]attributes=line.split(“,”);
double price=double.parseDouble(属性[1]);
添加(新产品(属性[0],价格));
}
reader.close();
}
公共产品(字符串名称,双倍价格){
this.name=名称;
这个价格=价格;
}
公共字符串getName(){
返回名称;
}
公共双getPrice(){
退货价格;
}
公共静态列表getList(){
退货清单产品;
}
}
整个问题在于使用静态变量:
private static String Name;
private static double Price;
它们属于类,而不是您创建的对象。创建最后一个对象时,它将覆盖其他对象
所以,完成任务的正确方法是更改产品类(请使用大写,因为它是命名类的代码约定)
类产品{
私有字符串名称;
私人双价;
public static List_product=new ArrayList();
公共产品(字符串名称,双倍价格){
this.name=名称;
这个价格=价格;
}
//…其他代码可以
}
调试器将帮助您修复它fyi:不要使用文件读取器来读取CSV,请使用类似Apache Common CSV的API来正确读取它。这比字符串更复杂。split(,”
任何地方都不能调用readPrice()。@dmitrichereimis如果你是对的,我必须先调用它,但问题是所有列的值都相同。换句话说,第二个值将覆盖第一个值,依此类推。有什么提示吗?请解释一下这是怎么发生的?我看到您使用ArrayList来存储产品对象。此数据结构允许重复。因此,您可以在其中放入任意数量的相等对象。我将重复CSV文件中的最后一个元素。我确信CSV文件有不同的元素在我的邮件中共享示例CSV文件nandhacs7@gmail.comShare示例csv文件和示例输出。我向您发送了一封电子邮件。
Try This,
Main.java
try {
Product.readPrice();
for (Product product : Product.getList()) {
System.out.println(product.getName()+"--"+product.getPrice());
}
}catch (IOException e) {
}
public class Product {
private String name;
private double price;
public static List<Product> listProduct = new ArrayList<>();
public static void readPrice() throws IOException {
FileReader info = new FileReader("info.csv");
BufferedReader reader = new BufferedReader(info);
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
String[] attributes = line.split(",");
double price = Double.parseDouble(attributes[1]);
listProduct.add(new Product(attributes[0], price));
}
reader.close();
}
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public static List<Product> getList() {
return listProduct;
}
}
private static String Name;
private static double Price;
class Product {
private String name;
private double price;
public static List<Product> List_product = new ArrayList<>();
public Product(String name, double price) {
this.name = name;
this.price = price;
}
//...other code is fine
}