【问题标题】:Large Switch Case (60 different Cases) - how do I reduce? or refine the code大型开关盒(60 种不同的盒) - 如何减少?或细化代码
【发布时间】:2019-03-01 16:56:09
【问题描述】:

所以我有一个开关盒,它输入边的长度(以 CM 为单位)并选择旋转机器人轮子的时间(以毫秒为单位),例如 用户输入 25 选择案例 25 并将时间设置为 2000 毫秒

但是有 60 种不同的可能情况(两次)我对如何缩小它感到困惑? 如果可以的话

import java.util.ArrayList;
import java.util.Scanner;
import edu.cmu.ri.createlab.terk.robot.finch.Finch;

public class assignment2 {
    static String shape,largestShapeName;
    static int side1,side2,side3;
    static int triangleCount=0,rectangleCount = 0;
    static int area,largestShape = 0;
    static int largestSide1,largestSide2,largestSide3;
    static int angle1,angle2,angle3;
    static boolean possible=false;
    static Scanner shapescanner = new Scanner(System. in);
    static Scanner sidescanner = new Scanner(System. in);
    static Finch myfinch = new Finch();
    static ArrayList<String> arrayShape = new ArrayList<String>();
    public static void main(String args[])
    {

        System.out.println("Please Enter The shape you want to Draw");

        shape = shapescanner.nextLine().toUpperCase();
        while (!"Q".equals(shape)){

        while (!"Q".equals(shape) && !"R".equals(shape) && !"T".equals(shape) ) {

                System.out.println(shape +" is an incorrect Option Please Enter again");
                shape = shapescanner.nextLine().toUpperCase();
        }
        if ("R".equals(shape)) {
            Rectangle();

        } else if ("T".equals(shape)) {
            Triangle();
        }
        if (area > largestShape) {
            if ("R".equals(shape)) {
                largestSide1=side1;
                largestSide2=side2;
                largestShapeName= "R";
            }else {
                largestSide1=side1;
                largestSide2=side2;
                largestSide3=side3;
                largestShapeName= "T";
            }
            System.out.println("Please Enter The shape you want to Draw");
            shape = shapescanner. nextLine().toUpperCase();
        }else {
        System.out.println("Please Enter The shape you want to Draw");
        shape = shapescanner. nextLine().toUpperCase();
        }
        }
        if ("Q".equals(shape)) {
             for (int i = 0; i < arrayShape.size(); i++) {
                  System.out.println(arrayShape.get(i));
                }
            myfinch.quit();
            System.exit(0);
        }
    }
    public static void Rectangle () {
        int side1time = 0;
        int side2time = 0;

        System.out.println("Please Enter The Length of first side");
        side1 = Integer.parseInt(sidescanner. nextLine());
        while (side1>80 || side1<20) {

            System.out.println(side1 +" is an incorrect Size Please Enter again");
            side1 = Integer.parseInt(sidescanner. nextLine());
    }
        System.out.println("Please Enter The Length of second side");
        side2 = Integer.parseInt(sidescanner. nextLine());
        while (side2>80 || side2<20) {

            System.out.println(side2 +" is an incorrect Size Please Enter again");
            side2 = Integer.parseInt(sidescanner. nextLine());
    }
        switch (side1) {
        case 20:  side2time = 2000 ;
        break;
        case 21:  side2time = 2000 ;
        break;
        case 22:  side1time = 2100 ;
        break;
        case 23:  side1time = 2200 ;
        break;
        case 24:  side1time = 2300 ;
        break;
        case 25:  side1time = 2400 ;
        break;
        case 26:  side1time = 2500 ;
        break;
        case 27:  side1time = 2600 ;
        break;
        case 28:  side1time = 2700 ;
        break;
        case 29:  side1time = 2800 ;
        break;
        case 30:  side1time = 2900 ;
        break;
        case 31:  side1time = 3000 ;
        break;
        case 32:  side1time = 3100 ;
        break;
        case 33:  side1time = 3200 ;
        break;
        case 34:  side1time = 3300 ;
        break;
        case 35:  side1time = 3400 ;
        break;
        case 36:  side1time = 3500 ;
        break;
        case 37:  side1time = 3600 ;
        break;
        case 38:  side1time = 3700 ;
        break;
        case 39:  side1time = 3800 ;
        break;
        case 40:  side1time = 3900 ;
        break;
        case 41:  side1time = 4000 ;
        break;
        case 42:  side1time = 4100 ;
        break;
        case 43:  side1time = 4200 ;
        break;
        case 44:  side1time = 4300 ;
        break;
        case 45:  side1time = 4400 ;
        break;
        case 46:  side1time = 4500 ;
        break;
        case 47:  side1time = 4600 ;
        break;
        case 48:  side1time = 4700 ;
        break;
        case 49:  side1time = 4800 ;
        break;
        case 50:  side1time = 4900 ;
        break;
        case 51:  side1time = 5000 ;
        break;
        case 52:  side1time = 5100 ;
        break;
        case 53:  side1time = 5200 ;
        break;
        case 54:  side1time = 5300 ;
        break;
        case 55:  side1time = 5400 ;
        break;
        case 56:  side1time = 5500 ;
        break;
        case 57:  side1time = 5600 ;
        break;
        case 58:  side1time = 5700 ;
        break;
        case 59:  side1time = 5800 ;
        break;
        case 60:  side1time = 5900 ;
        break;
        case 61:  side1time = 6000 ;
        break;
        case 62:  side1time = 6100 ;
        break;
        case 63:  side1time = 6200 ;
        break;
        case 64:  side1time = 6300 ;
        break;
        case 65:  side1time = 6400 ;
        break;
        case 66:  side1time = 6500 ;
        break;
        case 67:  side1time = 6600 ;
        break;
        case 68:  side1time = 6700 ;
        break;
        case 69:  side1time = 6800 ;
        break;
        case 70:  side1time = 6900 ;
        break;
        case 71:  side1time = 7000 ;
        break;
        case 72:  side1time = 7100 ;
        break;
        case 73:  side1time = 7200 ;
        break;
        case 74:  side1time = 7300 ;
        break;
        case 75:  side1time = 7400 ;
        break;
        case 76:  side1time = 7500 ;
        break;
        case 77:  side1time = 7600 ;
        break;
        case 78:  side1time = 7700 ;
        break;
        case 79:  side1time = 7800 ;
        break;
        case 80:  side1time = 7900 ;
        break;
        }
        switch (side2) {
        case 20:  side2time = 2000 ;
        break;
        case 21:  side2time = 2000 ;
        break;
        case 22:  side2time = 2100 ;
        break;
        case 23:  side2time = 2200 ;
        break;
        case 24:  side2time = 2300 ;
        break;
        case 25:  side2time = 2400 ;
        break;
        case 26:  side2time = 2500 ;
        break;
        case 27:  side2time = 2600 ;
        break;
        case 28:  side2time = 2700 ;
        break;
        case 29:  side2time = 2800 ;
        break;
        case 30:  side2time = 2900 ;
        break;
        case 31:  side2time = 3000 ;
        break;
        case 32:  side2time = 3100 ;
        break;
        case 33:  side2time = 3200 ;
        break;
        case 34:  side2time = 3300 ;
        break;
        case 35:  side2time = 3400 ;
        break;
        case 36:  side2time = 3500 ;
        break;
        case 37:  side2time = 3600 ;
        break;
        case 38:  side2time = 3700 ;
        break;
        case 39:  side2time = 3800 ;
        break;
        case 40:  side2time = 3900 ;
        break;
        case 41:  side2time = 4000 ;
        break;
        case 42:  side2time = 4100 ;
        break;
        case 43:  side2time = 4200 ;
        break;
        case 44:  side2time = 4300 ;
        break;
        case 45:  side2time = 4400 ;
        break;
        case 46:  side2time = 4500 ;
        break;
        case 47:  side2time = 4600 ;
        break;
        case 48:  side2time = 4700 ;
        break;
        case 49:  side2time = 4800 ;
        break;
        case 50:  side2time = 4900 ;
        break;
        case 51:  side2time = 5000 ;
        break;
        case 52:  side2time = 5100 ;
        break;
        case 53:  side2time = 5200 ;
        break;
        case 54:  side2time = 5300 ;
        break;
        case 55:  side2time = 5400 ;
        break;
        case 56:  side2time = 5500 ;
        break;
        case 57:  side2time = 5600 ;
        break;
        case 58:  side2time = 5700 ;
        break;
        case 59:  side2time = 5800 ;
        break;
        case 60:  side2time = 5900 ;
        break;
        case 61:  side2time = 6000 ;
        break;
        case 62:  side2time = 6100 ;
        break;
        case 63:  side2time = 6200 ;
        break;
        case 64:  side2time = 6300 ;
        break;
        case 65:  side2time = 6400 ;
        break;
        case 66:  side2time = 6500 ;
        break;
        case 67:  side2time = 6600 ;
        break;
        case 68:  side2time = 6700 ;
        break;
        case 69:  side2time = 6800 ;
        break;
        case 70:  side2time = 6900 ;
        break;
        case 71:  side2time = 7000 ;
        break;
        case 72:  side2time = 7100 ;
        break;
        case 73:  side2time = 7200 ;
        break;
        case 74:  side2time = 7300 ;
        break;
        case 75:  side2time = 7400 ;
        break;
        case 76:  side2time = 7500 ;
        break;
        case 77:  side2time = 7600 ;
        break;
        case 78:  side2time = 7700 ;
        break;
        case 79:  side2time = 7800 ;
        break;
        case 80:  side2time = 7900 ;
        break;
        }
        myfinch.setLED(0, 255, 0, 2000);
        myfinch.setWheelVelocities(100,100,side1time);
        myfinch.setLED(255, 0, 0, 200);
        myfinch.setWheelVelocities(100,0,2000);
        myfinch.setWheelVelocities(100,100,side2time);
        myfinch.setLED(255, 0, 0, 200);
        myfinch.setWheelVelocities(100,0,2000);
        myfinch.setWheelVelocities(100,100,side1time);
        myfinch.setLED(255, 0, 0, 200);
        myfinch.setWheelVelocities(100,0,2000);
        myfinch.setWheelVelocities(100,100,side2time);
        myfinch.setLED(255, 0, 0, 200);
        myfinch.setLED(0, 0, 0, 200);
        myfinch.setLED(255, 0, 0, 200);
        rectangleCount += 1;
        arrayShape.add(shape + ":" + side1 + "," + side2);
        System.out.println(arrayShape.get(0));
        area = side1 * side2;
    }
    public static void Triangle() {

    }
}

【问题讨论】:

    标签: java eclipse ide switch-statement


    【解决方案1】:

    您的switch(side1) 似乎相当于:

    if (side1 == 20) side2time = 2000;
    if (side1 > 20 && side1 <= 80) side2time = (side1 - 1) * 100
    

    同样适用于其他 switch 语句。

    【讨论】:

    • 谢谢!这确实适用于给定的值,但是,我必须承认它们是占位符,因为必须测试每个距离,并且 (20cm,21cm,22xm ++) 通过更改该 ms 值以使其达到正确的距离。实际值不像 side1-1 *100 那样线性,可以使用这些值
    • @AliB2512 请在您的帖子中包含这些以及所有其他要求。重写代码取决于您想要/需要的语义。如果您不解释语义,我们将无法在答案中解释它们。
    • @AliB2512 要么有一个公式来计算sidetime,要么每个值都是任意的。在第一种情况下,只需在代码中包含公式,在第二种情况下,您将不得不手动编写所有可能的值 - 使用开关可以替换为地图,但您仍然有 60 行代码。跨度>
    • @assylias,不幸的是,它们都是任意的,都是通过实验得出的,所以我想我无能为力,除非有那么多行代码
    【解决方案2】:

    如果要分配的值可以在以后更改,您可以使用键/值对填充映射并改用它(您可以将这些值放入文件中并读入,这样您就不必'如果这些值发生变化,则不需要重新编译类):

    private final static Map<Integer, Integer> SIDE2TIMEMap = new HashMap<>();
    
    static {
        SIDE2TIMEMap.put(Integer.valueOf(20), Integer.valueOf(2000));
        SIDE2TIMEMap.put(Integer.valueOf(21), Integer.valueOf(2000));
        // [...]
        SIDE2TIMEMap.put(Integer.valueOf(80), Integer.valueOf(7900));
    }
    

    稍后你可以得到这样的值:

    private static int getTimeForSide(int side) {    
        Integer timeVal = SIDE2TIMEMap.get(Integer.valueOf(side));
        if (timeVal == null) {
            timeVal = Integer.valueOf(1000); // default value
            // alternatively: throw new IllegalArgumentException("invalid side: " + side);
        }
        return timeVal.intValue();
    }
    
    [...]
    
        int side1time = getTimeForSide(side1);
        int side2time = getTimeForSide(side2);
    

    【讨论】:

    • sidetime 永远不会改变,如果您想行驶 20 厘米,轮子应该行驶 x 量,它们几乎就像一个查找表
    猜你喜欢
    • 2021-11-26
    • 2011-03-02
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多