【问题标题】:Array as the options for a switch statment数组作为 switch 语句的选项
【发布时间】:2008-11-12 02:52:43
【问题描述】:

我记得在大学时使用带有“二进制搜索”或“二进制开关”的开关。类似的东西,我的 google foo 今天坏了。无论如何,它是这样的:你定义了一个可能的选项数组(通常是字符串),一些神奇的事情发生了,数组中的那些选项变成了 switch 发生的情况。我记得他们必须按字母顺序才能工作。你能帮我记住魔法吗?即使是我应该看的名字也会很棒。

【问题讨论】:

    标签: java enums switch-statement


    【解决方案1】:

    我认为您正在寻找的是Enum

    从上面的链接...

    public enum Day {
        SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
        THURSDAY, FRIDAY, SATURDAY 
    }
    
    public class EnumTest {
    
        Day day;
    
        public EnumTest(Day day) {
            this.day = day;
        }
    
        public void tellItLikeItIs() {
             switch (day) {
                case MONDAY:
                     System.out.println("Mondays are bad.");
                     break;
    
                case FRIDAY:
                     System.out.println("Fridays are better.");
                     break;
    
                case SATURDAY:
                case SUNDAY:
                     System.out.println("Weekends are best.");
                     break;
    
                default:
                     System.out.println("Midweek days are so-so.");
                     break;
            }
        }
    
        ....
    }
    

    【讨论】:

      【解决方案2】:

      你是说 gperf 吗?或者您可能指的是一般的理论(散列)?

      http://www.gnu.org/software/gperf/

      【讨论】:

        【解决方案3】:

        通常,我不会以这种方式滥用开关(即使我可以)。尝试一下,您将无法让数组在 switch 语句中工作,因为它只允许在 case 行中使用常量值。您确定您没有考虑以下模式或枚举吗?

        final int RED = 0;
        final int YELLOW = 1;
        final int BLUE = 2;
        final int GREEN = 3;
        
        String[] colors = new String[] { "red", "yellow", "blue", "green" };
        
        switch (color) {
            case RED:
                System.out.println(colors[RED]);
                break;
            case YELLOW:
                System.out.println(colors[YELLOW]);
                break;
            ...the rest
        }
        

        【讨论】:

          【解决方案4】:

          使用不带开关的枚举如下:

          public enum Day {
              SUNDAY {
                public String tellItLikeItIs() {
                  return "Weekends are best.";
                }
              },
              MONDAY {
                public String tellItLikeItIs() {
                  return "Mondays are bad.";
                }
              }, 
              TUESDAY, 
              WEDNESDAY, 
              THURSDAY, 
              FRIDAY {
                public String tellItLikeItIs() {
                  return "TGI Friday.";
                }
              }, 
              SATURDAY {
                public String tellItLikeItIs() {
                  return "Weekends are best.";
                }
              }
          
              public String tellItLikeItIs() {
                 return "Midweek days are so-so.";
              }
          }
          
          public class TodayIs{
              public static void main(String... args) {
                   Day day = Day.valueOf(args[0].toUppercase());
                   System.out.println(day.tellItLikeItIs());
              }
          }
          

          【讨论】:

            【解决方案5】:
            public enum Day {
                SUNDAY ("sundays are this"),
                MONDAY ("mondays are that"), 
                TUESDAY ("blah"), 
                WEDNESDAY ("blah"), 
                THURSDAY ("blah"), 
                FRIDAY ("blah"), 
                SATURDAY ("more blah");
            
                private final String tell;
            
                public Day(String tell){
                   this.tell = tell;
                }
                public String tellItLikeItIs() {
                   return this.tell;
                }
            }
            
            public class TodayIs{
                public static void main(String... args) {
                     Day day = Day.valueOf(args[0].toUppercase());
                     System.out.println(day.tellItLikeItIs());
            

            我是 Java 枚举的新手,但我认为这也应该有效。

            【讨论】:

            • 是的,这也有效。只有它真的与问题无关(彼得劳里的回答也没有)。
            【解决方案6】:

            如果您选择使用枚举并且您的枚举集合很大,请使用:

            魔法:

            如果你在 eclipse 中工作,它会为你做一个“魔法”,你只需要编写以下内容(考虑到接受的答案的代码):

            switch (day) {
            }
            

            选择switch 并按Ctrl + 1,神奇的作品! (所有enum 值都将填充到switch 块的case 部分中)

            【讨论】:

              猜你喜欢
              • 2010-11-17
              • 1970-01-01
              • 1970-01-01
              • 2014-01-06
              • 2011-08-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多