在交换机内部使用Switch:Java

时间:2016-03-29 22:27:58

标签: java

enter image description here

我正在创建一个程序,询问用户诊断问题,然后询问另一个问题,新问题是根据他们以前的答案选择的。它基于从教科书中的章节分配中获取的图像。 我已经让程序工作,但对我来说,我的解决方案似乎效率低下,我想知道是否有更有效的方法来完成我的任务。该计划的目标是接受用户症状,然后根据这些症状提供诊断。对我来说,彼此内部有很多开关看起来很乱。

  import java.util.*;

  public class Diagnostic2 { 

 //main(): application entry point 
 public static void main(String[] args) { 
    System.out.println("\nFever Diagnostic Tool"); 
    System.out.println("=====================");
    System.out.println("\nDisclaimer: This tool is meant primarily to act as an indicator ");
  System.out.println("of possible causes of fever symptoms. It is not meant to replace");
  System.out.println("professional medical advise. If you believe you are sick "); 
  System.out.println("consult with your doctor about your symptoms."); 

  Scanner stdin = new Scanner(System.in);
  System.out.print("\nDo you have a fever? (y/n): "); 
  char fever = stdin.next().trim().charAt(0);

  String diagnosis = "Insufficient information to make diagnosis\n";
  char cough = 'n';
  char wheeze = 'n';
  char headache = 't';
  char achyJoints = 'n';
  char rash = 'n';
  char soreThroat = 'n';
  char backPain = 'n';
  char urinaryPain = 'n';
  char tooHot = 'n';
  char diarrhea = 'n';
  char vomit = 'n';

  switch (fever) {
     case 'y':
        System.out.print("\nAre you coughing? (y/n): "); 
        cough = stdin.next().trim().charAt(0);
        switch (cough) { 
          case 'y':
             System.out.print("\nAre you short of breath, wheezing, or coughing up phlegm? (y/n): ");
             wheeze = stdin.next().trim().charAt(0);
             switch (wheeze) { 
                case 'y': 
                   diagnosis = "Possibilites include pneumonia or infection of airways.\n";
                   break; 
                case 'n':
                   System.out.print("\nDo you have a headache? (y/n): ");
                   headache = stdin.next().trim().charAt(0);
                   switch(headache) {
                      case 'y': 
                         diagnosis = "Possibilites include viral infection.\n";
                         break; 
                      case 'n':
                         System.out.print("\nDo you have a aching bones or joints? (y/n): ");
                         achyJoints = stdin.next().trim().charAt(0);
                         switch(achyJoints) {
                            case 'y':
                               diagnosis = "Possibilites include viral infection.\n";
                               break; 
                            case 'n':
                               System.out.print("\nDo you have a rash? (y/n): ");
                               rash = stdin.next().trim().charAt(0);
                               switch(rash) { 
                                  case 'y':
                                     diagnosis = "Insufficient information to list possibilities, consult with doctor.\n";
                                     break; 
                                  case 'n':
                                     System.out.print("\nDo you have a sore throat? (y/n): ");
                                     soreThroat = stdin.next().trim().charAt(0);
                                     switch(soreThroat) { 
                                        case 'y':
                                           diagnosis = "Possibilites include throat infection.\n";
                                           break; 
                                        case 'n':
                                           System.out.print("\nDo you have back pain just above the waist with chills and fever? (y/n): ");
                                           backPain = stdin.next().trim().charAt(0);
                                           switch(backPain) { 
                                              case 'y':
                                                 diagnosis = "Possibilites include kidney infection.\n";
                                                 break; 
                                              case 'n':
                                                 System.out.print("\nDo you have pain urinating or are urinating more often? (y/n): ");
                                                 urinaryPain = stdin.next().trim().charAt(0);
                                                 switch(urinaryPain) {
                                                    case 'y':
                                                       diagnosis = "Possibilites include urinary tract infection.\n";
                                                       break; 
                                                    case 'n':
                                                       System.out.print("\nHave you spent the day in the sun or hot conditions? (y/n): ");
                                                       tooHot = stdin.next().trim().charAt(0);
                                                       switch(tooHot) { 
                                                          case 'y':
                                                             diagnosis = "Possibilites include sun stroke or heat exhaustion.\n";
                                                             break;
                                                          case 'n':
                                                             break; 
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }  
                            break;                       
          case 'n':  
             System.out.print("\nDo you have a headache? (y/n): ");
             headache = stdin.next().trim().charAt(0);
             switch(headache) { 
                case 'y': 
                   System.out.println("\nAre you experiencing any of the following: pain when"); 
                   System.out.println("bending your head forward, nausea or vomiting, bright");
                   System.out.print("light hurting your eyes, drowsiness, or confusion? (y/n): ");
                   vomit = stdin.next().trim().charAt(0);
                   switch(vomit){
                     case 'y': 
                        diagnosis = "Possibilites include meningitis.\n";
                        break; 
                     case 'n': 
                        System.out.print("\nAre you vomiting, or have had diarrhea? (y/n): ");
                        diarrhea = stdin.next().trim().charAt(0);
                        switch(diarrhea) {
                           case 'y': 
                              diagnosis = "Possibilites include digestive tract infection.\n";
                              break; 
                           case 'n':
                              System.out.print("\nDo you have a aching bones or joints? (y/n): ");
                              achyJoints = stdin.next().trim().charAt(0);
                              switch(achyJoints) {
                                 case 'y':
                                    diagnosis = "Possibilites include viral infection.\n";
                                    break; 
                                 case 'n':
                                    System.out.print("\nDo you have a rash? (y/n): ");
                                    rash = stdin.next().trim().charAt(0);
                                    switch(rash) { 
                                       case 'y':
                                          diagnosis = "Insufficient information to list possibilities, consult with doctor.\n";
                                          break; 
                                       case 'n':
                                          System.out.print("\nDo you have a sore throat? (y/n): ");
                                          soreThroat = stdin.next().trim().charAt(0);
                                          switch(soreThroat) { 
                                             case 'y':
                                                diagnosis = "Possibilites include throat infection.\n";
                                                break; 
                                             case 'n':
                                                System.out.print("Do you have back pain just above the waist with chills and fever? (y/n): ");
                                                backPain = stdin.next().trim().charAt(0);
                                                switch(backPain) { 
                                                   case 'y':
                                                      diagnosis = "Possibilites include kidney infection.\n";
                                                      break; 
                                                   case 'n':
                                                      System.out.print("\nDo you have pain urinating or are urinating more often? (y/n): ");
                                                      urinaryPain = stdin.next().trim().charAt(0);
                                                      switch(urinaryPain) {
                                                         case 'y':
                                                            diagnosis = "Possibilites include urinary tract infection.\n";
                                                            break; 
                                                         case 'n':
                                                            System.out.print("\nHave you spent the day in the sun or hot conditions? (y/n): ");
                                                            tooHot = stdin.next().trim().charAt(0);
                                                            switch(tooHot) { 
                                                               case 'y':
                                                                  diagnosis = "Possibilites include sun stroke or heat exhaustion.\n";
                                                                  break;
                                                               case 'n':
                                                                  break;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            break;
                case 'n': 
                    System.out.print("\nDo you have a aching bones or joints? (y/n): ");
                              achyJoints = stdin.next().trim().charAt(0);
                              switch(achyJoints) {
                                 case 'y':
                                    diagnosis = "Possibilites include viral infection.\n";
                                    break; 
                                 case 'n':
                                    System.out.print("\nDo you have a rash? (y/n): ");
                                    rash = stdin.next().trim().charAt(0);
                                    switch(rash) { 
                                       case 'y':
                                          diagnosis = "Insufficient information to list possibilities, consult with doctor.\n";
                                          break; 
                                       case 'n':
                                          System.out.print("\nDo you have a sore throat? (y/n): ");
                                          soreThroat = stdin.next().trim().charAt(0);
                                          switch(soreThroat) { 
                                             case 'y':
                                                diagnosis = "Possibilites include throat infection.\n";
                                                break; 
                                             case 'n':
                                                System.out.print("\nDo you have back pain just above the waist with chills and fever? (y/n): ");
                                                backPain = stdin.next().trim().charAt(0);
                                                switch(backPain) { 
                                                   case 'y':
                                                      diagnosis = "Possibilites include kidney infection.\n";
                                                      break; 
                                                   case 'n':
                                                      System.out.print("\nDo you have pain urinating or are urinating more often? (y/n): ");
                                                      urinaryPain = stdin.next().trim().charAt(0);
                                                      switch(urinaryPain) {
                                                         case 'y':
                                                            diagnosis = "Possibilites include urinary tract infection.\n";
                                                            break; 
                                                         case 'n':
                                                            System.out.print("\nHave you spent the day in the sun or hot conditions? (y/n): ");
                                                            tooHot = stdin.next().trim().charAt(0);
                                                            switch(tooHot) { 
                                                               case 'y':
                                                                  diagnosis = "Possibilites include sun stroke or heat exhaustion.\n";
                                                                  break;
                                                               case 'n':
                                                                  break;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }

            }
        }

     case 'n': 
        break;
    }


   System.out.println("--------------------------------------------------------------");
   System.out.println("\nSymptoms"); 
   if(fever == 'y') {
      System.out.println("*\tFever");
    }
   if(cough == 'y') {
      System.out.println("*\tCough");
    }
   if(wheeze == 'y') { 
      System.out.println("*\tWheezing");
    }
   if(headache == 'y') { 
       System.out.println("*\tHeadache");
    }
   if(achyJoints == 'y') { 
      System.out.println("*\tAchy joints or bones");
    }
   if(rash == 'y') { 
      System.out.println("*\tRash");
    }
   if(soreThroat == 'y') {
      System.out.println("*\tSore throat");
    }
   if(backPain == 'y') {
      System.out.println("*\tBack pain");
    }
   if(urinaryPain == 'y') { 
       System.out.println("*\tFrequent urination or pain urinating");
    }
   if(tooHot == 'y') {
      System.out.println("*\tDay spent in hot conditions"); 
    }
   if(diarrhea == 'y') { 
      System.out.println("*\tDiarrhea");
    }
   if(vomit == 'y') {
      System.out.println("*\tPain when bending head forward, nausea or vomiting,");
      System.out.println("\tbright light hurting eyes, drowsiness or confusion.");
    }
   System.out.println("\nDiagnosis");
   System.out.println("\t" + diagnosis);

}
}

1 个答案:

答案 0 :(得分:1)

有很多好方法可以做到,我认为嵌套开关不是一个。对于这种应用程序,最好使用数据驱动模型,因为您可以在以后更轻松地对其进行转换。只需考虑当前代码,将其转换回教科书中的图形就不能以简单的方式自动化。我试图展示一种更好的方式。有了这个模型在内存中的结构,你甚至可以编写一个程序来生成上面嵌套的Java代码。所以我建议这样的事情:

package hu.hege;

import java.util.Scanner;

public class State {

    public final boolean terminal;
    public final String message;
    public final State positive;
    public final State negative;

    public State(boolean terminal, String message, State positive, State negative) {
        this.terminal = terminal;
        this.message = message;
        this.positive = positive;
        this.negative = negative;
    }

    public State(String message) {
        this(true, message, null, null);
    }

    public State(String message, State positive, State negative) {
        this(false, message, positive, negative);
    }

    public static State buildGraph() {
        // It's recommended to engineer some file format, and read the graph
        // structure from a resource file here

        State insufficient = new State("Insuficcient information to list possibilities");
        State further = new State("Continue to ask questions here...");
        State qCough = new State("Are you coughing?", further, insufficient);
        State qFever = new State("Do you have a fever?", qCough, insufficient);

        // return entry question
        return qFever;
    }

    public static void main(String[] args) {
        State current = buildGraph();
        Scanner stdin = new Scanner(System.in);
        for (;;) {
            System.out.println(current.message);
            if (current.terminal)
                break;
            String choice = stdin.next().trim();
            if (choice.startsWith("y")) {
                current = current.positive;
            } else if (choice.startsWith("n")) {
                current = current.negative;
            } else {
                System.out.println("Unrecognized answer");
            }
        }
        stdin.close();
    }

}

此代码基本上在内存中构建与教科书中相同的图形,并将其解释为它是计算机程序。当我们的目标是编写清晰且可维护(但速度稍慢)的代码时,我们一直在进行这种解释。