从CSV读取产品存入ArrayList后打印重复最后元素的问题
问题分析与解决方案
嘿,我一眼就看出问题所在了——你的product类里的属性变量被错误地声明成**静态(static)**的了!
核心问题
private static String Name; private static double Price;
静态变量是属于整个product类的,而不是每个product对象实例独有的。每次你调用new product(...)创建新对象时,都会把这两个静态变量的值覆盖成当前对象的参数。所以当你遍历列表时,所有对象的getName()和getPrice()返回的都是最后一次设置的TV和250。
修复步骤
- 去掉属性的static关键字,让它们成为实例变量,每个对象拥有自己独立的属性值:
private String Name; private double Price;
- 修正构造方法的赋值逻辑,直接给当前实例的属性赋值(可以用
this关键字明确指向当前对象,避免歧义):
public product(String Name, double Price) { this.Name = Name; this.Price = Price; }
修正后的完整product类代码
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class product { // 去掉static,改为实例变量 private String Name; private 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会报错 double price = Double.parseDouble(attributes[1].trim()); List_product.add(new product(attributes[0].trim(), 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 List_product; } }
另外补充个小细节:你的CSV每行的第二个字段后面有空格(比如, 20000),解析double的时候记得用trim()去掉空格,否则会抛出NumberFormatException。
运行结果
修改后再执行你的main方法,就能得到正确的输出了:
car--20000.0 table--150.0 TV--250.0
内容的提问来源于stack exchange,提问作者csse
相关产品推荐
相关产品推荐

