切换比较字符

时间:2017-04-17 14:31:03

标签: java hashmap

我遇到了将字符串输入转换为字符以及将字符与开关进行比较的问题。我希望用户输入比萨大小的顺序,然后输入最多4个浇头,例如" lop"(大橄榄菠萝),我想分割并比较字符串到字符所以我可以输出订单作为"中等披萨用橄榄,菠萝" (披萨上的菠萝,我知道异端邪说)并且最后总计。

我是否正确地处理这类任务,或者使用数组更容易,拆分数组输入并比较字符串的每个字母而不是使用字符和哈希图?

到目前为止我的代码

import java.util.Scanner;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class Exercise_1{
    public static void pizzaServiceA(String args[]){

        HashMap <Character, String> Toppings = new Hashmap <Character, String>();

        //pizza
        Toppings.put('m', "meduim");
        Toppings.put('l', "large");

        //topping
        Toppings.put('h', "ham");
        Toppings.put('m', "mozzerella");
        Toppings.put('o', "olives");
        Toppings.put('p', "pineapple");
        Toppings.put('s', "spinach");

        Toppings.put('H', "ham");
        Toppings.put('M', "mozzerella");
        Toppings.put('O', "olives");
        Toppings.put('P', "pineapple");
        Toppings.put('S', "spinach");


        HashMap <Character, Double> Prices = new Hashmap <Character, Double>();


        //pizza price 
        Prices.put('m', 4.00);
        Prices.put('l', 5.00);

        //topping price medium
        Prices.put('h', 1.40);
        Prices.put('m', 1.00);
        Prices.put('o', 0.80);
        Prices.put('p', 1.00);
        Prices.put('s', 1.20);

        //topping price large
        Prices.put('H', 2.10);
        Prices.put('M', 1.50);
        Prices.put('O', 1.20);
        Prices.put('P', 1.50);
        Prices.put('S', 1.20);

        Scanner in = new Scanner(System.in);
        System.out.println("Enter order: ");
        String input = in.nextLine();
        Character order = Character.valueOf(input);

        Double totalPrice = 0.0;

        switch (order){

            case 'm': 
                    totalPrice += 4.00;
                    System.out.println("Medium pizza ");
                    break;

            case 'l': 
                    totalPrice += 5.00;
                    System.out.println("Large pizza ");
                    break;
        }

    }
}

编辑:确定所以这就是我现在提出的问题(仍然使用哈希映射但丢弃交换机

System.out.println("Enter a pizza order: ");
    Scanner reader = new Scanner(System.in);
    String orders = reader.nextLine();
    Char[] orderLetters = orders.toCharArray();


    String fullOrder = "";
    Double fullPrice = 0.0;


    //check if sequence enters it more than 5 characters

    if (orderLetters.equals("quit")) {
            System.out.println("Quitting.");
            System.exit(0);
        } 

    else if (!(orderLetters[0].equals('l')))
    {
        System.out.println("Please enter the size of your pizza, m or l");

    }

    else if (!(orderLetters[0].equals('m')))
    {
        System.out.println("Please enter the size of your pizza, m or l");
    }


    for(Character orderLetters : c.toCharArray())
    {
        Double price = Prices.get(orderLetters);
        fullPrice += price;

        Character type = Toppings.get(orderLetters);
        if(type == 'm' || type == 'l')
        {
            fullOrder += type + " pizza with ";
        }
        else
        {
            fullOrder += type + ",";
        }


    }
    fullOrder += fullPrice;
    System.out.printf("%.2f", "£", fullOrder);

}

2 个答案:

答案 0 :(得分:0)

  

我是否正在为这类任务走上正轨,否则会更容易   使用数组,拆分数组输入并比较每个字母   字符串而不是使用字符和哈希映射?

这取决于。拥有包含所有数据的输入API对于客户端来说可能是笨拙的。如果他想因为忘记而添加别的东西,他就不能。他必须从一开始就重新开始他的命令。

你使用的方式似乎没问题 然而,大开关更难以维持 您应该在Map中使用具有结构化数据的对象。

    Character order = Character.valueOf(input);
    switch (order){

        case 'm': 
                totalPrice += 4.00;
                System.out.println("Medium pizza ");
                break;

        case 'l': 
                totalPrice += 5.00;
                System.out.println("Large pizza ");
                break;
    }

可能是:

    Set<Character> toppingKeysAccepted = Arrays.asList(toppings.keySet());
    ...
    Character order = input.charAt(0); 
    if (toppingKeysAccepted.contains(order)){
          Pizza pizza = pizzas.get(order);               
          totalPrice + = pizza.getPrice();
          System.out.println(pizza.getText());
    }

    else{ //processing error case

    } 

作为旁注,您可以通过执行String

将包含单个字符的char c = string.charAt(0);转换为字符。

答案 1 :(得分:0)

您的代码存在一些问题:

<强> 1。哈希

你正在使用从字符到字符串的散列图,这没关系,但是每个字符只能有一个输出(你不能'm'指向'medium'和'mozzerella')。

这可以通过两种方式解决:

  1. 使用2个地图(不必是hashmap,也可以使用treemap)。一个用于尺寸,一个用于浇头。
  2. 改变你看待角色的方式。使'm'只表示一件事,并为每个字母这样做。没有一封信可以有多个含义。
  3. 我个人认为第一种方式更好。尺寸和浇头不应该在同一个变量上,它们不以任何方式连接。

    <强> 2。您阅读输入的方式 首先,您可以使用read()的{​​{1}} instread 其次,您需要将输入视为字符串而不是字符。然后使用readLine()读取字符串中的字符。

    我对问题的解决方案的一般流程

    1. 从用户
    2. 读取输入字符串
    3. 使用简单的开关确定披萨的大小(这是一个非常有限的检查,所以让我们保持简单。
    4. 迭代字符串中的所有剩余字母,并为每个字母使用浇头哈希来添加价格
    5. 在完成所有这些之后,在评估整个字符串(包括大小和顶部)后,您将获得价格。

      希望这会有所帮助;)