【问题标题】:How to print out the contents of a HashMap in a certain format?如何以某种格式打印出HashMap的内容?
【发布时间】:2013-12-31 01:28:07
【问题描述】:

我不完全确定我会怎么做,这是我的代码:

public class PizzaMenu
{
    static Map<String,Pizza> namedPizzas= new HashMap<String,Pizza>();

    public static void main(String[] args)
    {

    }

    public static void addItem(String name, Pizza pizza)
    {
        namedPizzas.put(name, pizza);
    }

    public String printMenu()
    {
        /*
        String menuString="";
        for (Every menu item)

        {
            //Add name of menu item to menuString with carriage return
            //Add details of menu item (pizza.getInfo();) to menuString
        }
        */

        //return menuString
    }
}

然后我会在另一个班级打电话给System.out.println(PizzaMenu.printMenu())。我希望实现的格式如下:

/*
 * PizzaName
 *      Details
 * 
 * Next PizzaName in menu
 *      Details
 * 
 * Next PizzaName in menu
 *      Details
 * 
 * 
 * 
 */

我可能为这种类型的操作使用了错误的数据结构,还是有办法实现这一点?

这里是 Pizza 类的结构(对于格式不佳表示歉意):

public class Pizza
{
private double cost;
private Boolean veg;
private PizzaBase base;
private List<PizzaTopping> toppings = new ArrayList<PizzaTopping>();

public Pizza(PizzaBase base, PizzaTopping topping) //Constructor for pizza with 1 topping
{
    setBase (base);
    toppings.add(topping);
}

public Pizza(PizzaBase base, PizzaTopping topping, PizzaTopping topping2) //Constructor for pizza with 2 toppings
{
    setBase (base);
    toppings.add(topping);
    toppings.add(topping2);
}

public Pizza(PizzaBase base, PizzaTopping topping, PizzaTopping topping2, PizzaTopping topping3) //Constructor for pizza with 3 toppings
{
    setBase (base);
    toppings.add(topping);
    toppings.add(topping2);
    toppings.add(topping3);
}



public double getCost()
{
    return cost;
}

public void setCost(double cost)
{
    this.cost = cost;
}

public PizzaBase getBase()
{
    return base;
}

public void setBase(PizzaBase base)
{
    this.base = base;
}

public List<PizzaTopping> getToppings()
{
    return this.toppings;
}

public String getToppingsInfo()
{
    String toppingInfo = "\n";
    PizzaTopping t;
    for (int i = 0; i<getToppings().size();i++)
    {
        t = toppings.get(i);
        toppingInfo=toppingInfo+t.getInfo();
    }

    return toppingInfo;
}


public Boolean getVeg()
{
    return veg;
}

public void setVeg(Boolean veg)
{
    this.veg = veg;
}


public double calculateCost()
{
    PizzaTopping p;
    //Loop through all ingredients and add their costs to total cost
    for (int i = 0; i<toppings.size();i++)
    {
        p = toppings.get(i);
        cost+=p.getCost();
    }

    cost+=base.getCost(); //Add pizza base cost to total cost
    return cost;
}

//Check if pizza is vegetarian depending upon its ingredients 
public Boolean isVeg()
{
    Boolean toppingCheck =true;
    Boolean baseCheck = true;
    PizzaTopping t; //Temporary value used to stored toppings being compared in for loop

    //Check each topping and check if it's suitable for vegetarians
    for (int i =0; i<toppings.size();i++)
    {
        while (toppingCheck == true)
        {
            t = toppings.get(i);
            if (t.getVeg()==false)
            {
                toppingCheck = false;
            }
        }   
    }

    //Check base to see if it's suitable for vegetarians
    if (getBase().getVeg()==false)
    {
        baseCheck = false;
    }

    //Return value depending on if all ingredients are suitable for vegetarians
    if (toppingCheck == true && baseCheck == true)
    {
        return true;
    }

    else return false;

}

public String getInfo()
{
    String vegInfo;

    if (this.isVeg()==true)
    {
        vegInfo = "Yes";
    }

    else vegInfo ="No";

    return String.format("Toppings:%s\n"+"Base:\n%s"+"\nTotal Cost:\t£%.2f"+"\nSuitable for vegetarians: %s", getToppingsInfo(), getBase().getInfo(), calculateCost(), vegInfo);
    //Return list of toppings, Total Price, vegetarian

}

}

【问题讨论】:

  • 你只需要实现你的 printMenu()。你的问题到底出在哪里?
  • @EdgarBoda for (Every menu item) 我怀疑这部分。 @OP:试试HashMap.keySet().iterator()
  • Pizza 类的结构是什么。请附上它的代码。
  • 另外,使用toString() 作为您的方法名称。 printMenu 没有任何意义,因为它不打印。那么你的打印语句就是:System.out.println(myPizzaMenu);toString 将被隐式调用。
  • @EdgarBoda 我不确定如何在不明确知道其中包含哪些键的情况下从地图中获取键。例如,如果我使用列表,我可以在 for 循环中编写 namedPizzas.get(i) 来依次访问每个元素

标签: java map hashmap iteration


【解决方案1】:

试试这个:

String menuString="";
for (Map.Entry<String, Pizza> pizzaItem : namedPizzas.entrySet()) {
    menuString += pizzaItem.getKey() + "\n";
    menuString += "\t" + pizzaItem.getValue().getInfo() + "\n\n";
}

【讨论】:

  • 抱歉误报,这段代码似乎由于某种原因没有执行,程序只是继续运行,什么也不做
  • @AJCol 你怎么称呼它?
  • 首先我尝试从另一个类调用它,然后我尝试在 PizzaMenu 的 main 中调用它,然后从另一个类调用 main 方法。之后,我尝试从main方法调用它并简单地运行main,都没有成功
  • 您将它添加到 printMenu() 方法中?如果您的地图中有披萨,则此方法将保证有效。我认为问题出在其他地方。
  • 是的,我确保在实例化所有比萨饼并将其添加到菜单后调用 printMenu()
【解决方案2】:
public String printMenu()
    {

        String s ="";
        for (String key: namedPizzas.keySet()){
            s+= pizzaItem.getKey() + "\n";
            s+= "\t" + pizzaItem.getValue().getInfo() + "\n\n";               
        }
       return menuString
    }

【讨论】:

  • namedPizzas.get(key) 应该只是 keypizzaItem.getValue().getInfo() 应该是 namedPizzas.get(key).getInfo()
【解决方案3】:

直接解决您的问题:

您需要一组键。使用一组键,您还可以获取值。 HashMap#keySet 应该为此工作。您可以使用for each loop 循环遍历一组。

然后正如你所说,你需要构建你的字符串并返回。把它放在一起给你:

public String printMenu()
{
    String menuString = "";
    for(String key : namedPizzas.keySet())
    {
        menuString += key + "\n" +
                      "\t" + namedPizzas.get(key).getInfo() + "\n\n";
    }
    return menuString;
}

我还想提出改进设计的建议。对于这样的事情,您应该覆盖 Object#toString 方法。当您尝试打印对象时,将自动调用 toString 方法。这允许您这样做:System.out.println(myPizzaMenu); 而不是 System.out.println(myPizzaMenu.printMenu());

printMenu 的名称也具有误导性,因此它也很糟糕。

【讨论】:

    【解决方案4】:

    很遗憾,将地图切换为列表后,还是不行。一个小时后,我发现了导致这一切的错误!感谢大家的解答,下次需要用到地图的时候会记住这些方法。

    编辑:这是新的类结构供参考:

    public class PizzaMenu
    {
    static List<Pizza> namedPizzas = new ArrayList<Pizza>();
    
    public static void main(String[] args)
    {
    
    }
    
    public static void addItem(String name, Pizza pizza)
    {
        pizza.setName(name.toLowerCase());
        namedPizzas.add(pizza);
    }
    
    
    public static String  printMenu()
    {
        String menuString="";
        Pizza p;
    
        //Collect all pizzas and add their information to string
        for (int i =0; i<namedPizzas.size(); i++)
        {
            p = namedPizzas.get(i);
            menuString+=p.getName().toUpperCase()+"\n"+p.getInfo()+"\n\n";
            p.resetCost();
        }
    
        return menuString;
    
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 2011-04-06
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多