gpt4 book ai didi

java - 如何访问从另一个类中的文本文件导入的 map ?

转载 作者:行者123 更新时间:2023-12-02 11:57:27 24 4
gpt4 key购买 nike

我有三个类(Main、Product 和 Counter)。 Product 创建一个名为 mProductMap 的新 TreeMap。 Product 还具有将 TreeMap 写入文本文件的导出方法。使用 import 方法可以从中读取数据。当我运行 Main 时,文本文件已经创建。 Counter 类使用 TreeMap 对键的值进行计算。

Product 和 Counter 中的所有方法过去都位于同一个类中,直到我决定将某些方法单独放在自己的类中是更好的做法。我正在尝试使用 Product 中的 getter 方法访问 Counter 类中的 TreeMap,然后使用 Counter 中的方法。

问题:当所有东西都在同一个类中时,一切都有效。现在,我将方法放在单独的类中,Counter 方法无法读取 TreeMap 中的内容。它返回 else 语句:“Key1 不存在。请重试。”

有人可以向我解释一下发生了什么事以及如何解决这个问题吗?我不知道这是否是重要信息,但是:类 Product 和 Counter 位于同一个包中。主要导入该包。

主类:

public class Main {
public static void main(String[] args) {
Product product = new Product();
Counter counter = new Counter();
product.importFrom("prices.txt");
counter.add("Key1");
counter.add("Key2");
counter.add("Key3");
product.exportTo("prices.txt");
}
}

产品类别:

public class Product {
private TreeMap<String, BigDecimal> mProductMap = new TreeMap<>();

public TreeMap<String, BigDecimal> getProductMap() {
return mProductMap;
}

public void setProductMap(TreeMap<String, BigDecimal> productMap) {
mProductMap = productMap;
}

public void addProduct(String product, BigDecimal price) {
mProductMap.put(product, price);
}

public void exportTo(String fileName) {
try (
FileOutputStream fos = new FileOutputStream(fileName);
PrintWriter writer = new PrintWriter(fos);
) {
for(Map.Entry<String, BigDecimal> entry : mProductMap.entrySet()) {
writer.printf("%s|%s%n",
entry.getKey(),
entry.getValue());
}
} catch(IOException ioe) {
System.out.printf("Problem saving %s %n", fileName);
ioe.printStackTrace();
}
}

public void importFrom(String fileName) {
try (
FileInputStream fis = new FileInputStream(fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
) {
String line;
while((line = reader.readLine()) != null) {
String[] args = line.split("\\|");
addProduct(args[0], new BigDecimal(args[1]));
}
} catch(IOException ioe) {
System.out.printf("Problems loading %s %n", fileName);
ioe.printStackTrace();
}
}
}

计数器类别:

public class Counter {
private BigDecimal total = new BigDecimal("0.00");
Product p = new Product();

private TreeMap<String, BigDecimal> newMap = p.getProductMap();

public void add(String product) {
if (newMap.containsKey(product)) {
BigDecimal price = newMap.get(product);
total = total.add(price);
} else {
System.out.printf("%s does not exist. Please try again.%n", product);
}
System.out.printf("Adding %s. Total is %s%n", product, total);
}
}

最佳答案

问题就在这里(在Counter内):

Product p = new Product();

private TreeMap<String, BigDecimal> newMap = p.getProductMap();

Product 的实例(变量 p)与在 main 方法中加载文本文件的实例不同。 Product 的每个实例都将拥有自己的 mProductMap 集合。

修复建议

您可以将 Product 的实例传递给 Counter 的构造函数,而不是让 Counter 创建 Product 的私有(private)副本...

public class Counter {
private BigDecimal total = new BigDecimal("0.00");
private final Product p;

public Counter(Product p) {
this.p = p;
}

public void add(String product) {
TreeMap<String, BigDecimal> pMap = p.getProductMap();
if (pMap.containsKey(product)) {
BigDecimal price = pMap.get(product);
total = total.add(price);
} else {
System.out.printf("%s does not exist. Please try again.%n", product);
}
System.out.printf("Adding %s. Total is %s%n", product, total);
}
}

然后在您的 main 方法中,像这样创建您的 Counter...

Counter counter = new Counter(product);

关于java - 如何访问从另一个类中的文本文件导入的 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47498406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com