java - 在交换机内部使用交换机:Java-LMLPHP

我正在创建一个程序,该程序询问用户诊断问题,然后询问另一个问题,根据他们先前的答案选择新问题。它基于从教科书中的章节分配中获得的图像。
我已经使该程序开始工作,但是对我来说,我的解决方案似乎效率不高,我想知道是否有更有效的方法来完成任务。该程序的目标是吸收用户症状,然后根据这些症状提供诊断。对我来说,彼此之间有那么多开关看起来很混乱。

  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);

}
}

最佳答案

有很多好的方法可以做到这一点,我认为嵌套开关不是一个。对于这种应用程序,最好使用数据驱动的模型,因为以后可以更轻松地对其进行转换。仅考虑当前的代码,就无法通过简单的方法将其转换回教科书中的图形。我试图显示一种更好的方法。通过将模型存储在内存中,您甚至可以编写一个程序来生成上述嵌套的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();
    }

}


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

10-06 07:11