我有三个类(Main、Product 和 Counter)。Product 创建一个名为 mProductMap 的新 TreeMap。产品还具有将 TreeMap 写入文本文件的导出方法。使用 import 方法从中读取。运行 Main.txt 时已创建文本文件。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
集合。
您可以将 的实例传递给...的构造函数,而不是Counter
创建 的私有副本。Product
Product
Counter
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句