【问题标题】:how do you make both arrays correlate in java?你如何使两个数组在java中相互关联?
【发布时间】:2013-09-15 16:56:08
【问题描述】:

我希望能够关联这两个数组,以便当我从用户输入开始时,我可以访问名称和价格

public class fastFood
{
  public static void main (String[]args)
   {
    //array for prices and order
     double[] prices= new double[]{"5.79", "6.79", "4.59", "5.39", "6.59", "7.29", "6.09", "5.69"};
     String[] menu= new String[8];
     menu[0]="Whopper Meal";
     menu[1]="Double Whopper Meal";
     menu[2]="Chipotle Whopper Meal";
     menu[3]="Whopper Jr. Meal";
     menu[4]="BK Double Stacker Meal";
     menu[5]="Premium Chicken Sandwhich (Crispy or Grilled) Meal";
     menu[6]="Chipotle Chicken Sandwhich (Crispy or Grilled) Meal";
     menu[7]="OriginalChicken Sandwich Meal";


  }
 }

【问题讨论】:

  • 你的问题让我感到很饿。 :) 使用 Map

标签: java arrays


【解决方案1】:

您的代码中几乎没有错误:

  1. 您将字符串存储在双精度数组中? (我不知道为什么。那甚至无法编译。)

  2. 永远不要将价格存储为双倍或浮动(一个错误)。 floatdouble 没有足够的精度来准确存储所有浮点数。例如,0.1 无法准确存储在 doublefloat 中。就货币价值而言,你不能掉以轻心。您应该使用 BigDecimal 来代替它,它是任意精度的有符号十进制数。

  3. 您应该维护一个从项目到价格的Map<String, BigDecimal> 映射,而不是维护两个不同的数组。

  4. 然后,为了进一步重构您的代码,您应该创建一个类 Item 来存储所有这些属性,如下所示:

    class Item {
        private String name;
        private BigDecimal price;
    
        // constructors, getters, setters
    }
    

    然后,维护一个项目列表:

    List<Item> items = new ArrayList<Item>();
    

另请参阅:

【讨论】:

  • 您是否提到价格应该存储为 BigDecimal 因为交换原因(美元 -> 欧元 f.e.)?还是有其他原因?
  • @SteveBenett。不,那是另一个问题。 double 和 floats 没有足够的精度来准确表示所有浮点数。而且用货币价值,精度是玩不来的。
  • @rohitjain 您应该将该解释添加到您的答案中。
【解决方案2】:

您可以使用java.util.HashMap(或其他一些java.util.Map 实现)。

Map<String, Double> menu = new HashMap<String, Double>();
menu.put("Whopper Meal", 5.79d);
//..and so on.

【讨论】:

    【解决方案3】:

    虽然我同意这是一种糟糕的实现方式,但您可以通过使用相同的索引访问它们来轻松地将它们关联起来。只要它们以正确的顺序输入,这将起作用。

    double price = prices[2];
    String menuItem = menu[2];
    
    System.out.println(String.format("%s costs $%.2d",menuItem, price);
    

    这应该打印“Chipotle Whopper Meal cost $4.59”。

    根据您这样做的目的,您确实应该考虑创建对象来表示这些菜单项。示例:

    public class MenuItem
    {
         public double price;
         public String name;
    
         public MenuItem(String name, double price)
         {
             this.name = name;
             this.price = price;
         }
    
         @Override
         public String toString()
         {
             return String.format("name: %s cost: $%.2d",name,cost);
         }
    }
    

    现在在您的代码中,您可以执行以下操作:

    List<MenuItem> menuItems = Arrays.asList(
        new MenuItem("Big Mac",4.23);
        new MenuItem("Quater Pounder",3.23);
        new MenuItem("Chicken Sandwich",5.63);
    );
    
    for(MenuItem m : menuItems)
    {
        System.out.println(m.toString());
    }
    

    这将打印出 menuItems 中的每个项目。名称和价格是自动关联的,因为它们作为属性一起包含在 MenuItem 对象的每个实例中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      相关资源
      最近更新 更多