Java 使用HashMap是计算具有多个子部件的部件价格的最佳方法吗?

Java 使用HashMap是计算具有多个子部件的部件价格的最佳方法吗?,java,hashmap,sum,key,Java,Hashmap,Sum,Key,问题:编写一个计算零件价格的程序。该部分有多个子部分,各自有各自的成本。使用HashMap是最好的方法吗 以下是我所拥有的: import java.util.HashMap; 导入java.util.Map; 导入java.util.Iterator; 导入java.util.Set; 导入java.text.NumberFormat; 公共级火箭结构{ 公共静态void main(字符串参数[]){ /*声明HashMap和格式化程序*/ HashMap hmap=新的HashMap();

问题:编写一个计算零件价格的程序。该部分有多个子部分,各自有各自的成本。使用HashMap是最好的方法吗

以下是我所拥有的:

import java.util.HashMap;
导入java.util.Map;
导入java.util.Iterator;
导入java.util.Set;
导入java.text.NumberFormat;
公共级火箭结构{
公共静态void main(字符串参数[]){
/*声明HashMap和格式化程序*/
HashMap hmap=新的HashMap();
NumberFormat formatter=NumberFormat.getCurrencyInstance();
/*向HashMap添加元素(名称、价格)*/
hmap.put(“鼻锥”,1233863.45);
hmap.put(“框架”,76495.26);
hmap.put(“泵”,4679358.25);
hmap.put(“Fin”,467945.25);
hmap.put(“喷嘴”,46235.72);
/*HashMap大小和零件信息*/
System.out.println(“火箭结构|总部件:+hmap.size());
System.out.println(“---------------------------------------------”);
/*使用迭代器显示内容*/
Set=hmap.entrySet();
迭代器迭代器=set.Iterator();
while(iterator.hasNext()){
Map.Entry mentry=(Map.Entry)迭代器.next();
System.out.print(mentry.getKey()+“| Cost:”);
System.out.println(formatter.format(mentry.getValue());
}
/*计算所有子零件的总价值*/
双和=0f;
for(双值:hmap.values()){
总和+=数值;
}
System.out.println(“---------------------------------------------”);
System.out.println(“总成本:+formatter.format(总和));
}
}
结果:

火箭结构-共5部分


框架成本:76495.26美元

鼻锥|成本:1233863.45美元

泵|成本:4679358.25美元

喷嘴|成本:46235.72美元

财务费用:467945.25美元


总费用:6503897.93美元


是的,或者您可以使用两个单独的列表。 一个是实物,另一个是价格。您可以使用索引,如: 对象[i] 价格[i] 你明白我的意思吗? 希望我能帮你一点忙

是的。 HashMap以其“键值对”而闻名,在这个特定场景中使用它们将是最好的解决方案,以避免使用或多个单一集合并维护索引值

Opmtimality,这是:)


谢谢。

这里真正的答案是:创建一个代表产品的类。然后,
Product
类可以引用一些子类,它们也是
Products
。然后你可以做一些类似的事情:

class Product {
  List<Product> children ...
  double basePrice ...

  Product(double basePrice) { ...

  Product(List<Product> children) { ...

  double getPrice() { 
    if (children.isEmpty()) return basePrice;
    else return SUM over getPrice() called on each child
类产品{
列出孩子们。。。
双基价格。。。
产品(双基价){。。。
产品(列表子项){。。。
双getPrice(){
if(children.isEmpty())返回基价;
else返回对每个子级调用的getPrice()的总和
意思是:当一个产品不是由其他产品组成时,它有一个固定的基价。但是如果一个产品是由其他产品组成的,那么它的价格是从子产品中计算出来的

这里的关键点是:价格和产品之间的关系应该明确。使用不同列表或地图的想法……对于初稿版本来说很好。但在任何现实场景中,您都希望真正对这种关系进行建模。在良好的OOP中,建模的关键是:创建适当的类结构


进一步思考:实际上,您可以在这里转向多态性方法。然后创建两个子类:一个是固定价格的子类。另一个是包含子产品的子类,其中价格是子产品价格的总和。

我在这里使用
HashMap
没有发现任何问题。请注意我在回答中添加的更新。太好了,谢谢。这个问题是在白板访谈中提出的,我不确定可以接受
HashMap
解决方案。这实际上与“良好实践”相反。您在两个列表之间引入了一种隐式关系。当产品和价格之间存在如此重要的关系时,则使用两个列表并通过“同一索引”将它们“连接起来”这不是一个好主意。非常感谢你给出这个复杂的答案。
class Product {
  List<Product> children ...
  double basePrice ...

  Product(double basePrice) { ...

  Product(List<Product> children) { ...

  double getPrice() { 
    if (children.isEmpty()) return basePrice;
    else return SUM over getPrice() called on each child