1

不知道我将如何攻击这个。

基本上我所拥有的是不同长度的输入,一次或多次,这将导致一个动作。它来自输入的输入、文件等。

我不知道通过什么以及如何解决这个问题。最好有一个函数返回int对应于 an public static final int FOO = 1;enuman 或其他方式的 an 吗?

我现在拥有的是一系列 if 语句,如:

if (str.equals("foo") || str.equals("F")) {
      blah;
} else if (str.equals("beach")) {
      more blah;
}

这和任何一样好,还是有更好的方法?看过enum但似乎比在例如 C 中更重要。这可能是错误的,但它会朝着这个方向发展吗?

class Mother
{

    HappyCamping() {
        switch (ValInput(str)) {
        case FOO: do fo; break;
        case BAR: do bar; break;
        case BAZ: do fo bar: break
        ...
    }

    private enum ValInput(String str)
    {
         FOO("foo"), BAR("bar"), BAZ("baz");

         private int value;

         private ValInput(String str) {
              if (str.equals("blah"))
                   this.value = 1;
              ...
         }
    }
}

要点是采用更清洁的方法并将“解析”与主程序分开。这里有什么好方法?

4

5 回答 5

1

这和任何一样好,还是有更好的方法?看过枚举,但似乎比在例如 C 中更重要。这可能是错误的,但它会朝着这个方向发展吗?

然后去学习枚举是如何工作的。不要仅仅因为它具有更多功能而避免可能解决您的问题的功能。如果您想要一组固定的操作,您的设计可能会想要使用 Java 样式的枚举。

enum Action { CLICK("click"), CLEAR("erase"); } 

等是一个好的开始。

Java(我认为从 6 开始,可能是 7)也支持switch使用字符串而不是整数或枚举值。

于 2013-03-15T18:55:42.293 回答
1

不确定我是否理解整个问题,但您可以在 Java 中轻松地将字符串转换为枚举。

如果条目字符串是有限且预定义的,并且您想将其解析为枚举使用

EnumType.valueOf("foo")

我推荐阅读 Java 枚举,与 C 枚举相比,它们非常强大。

于 2013-03-15T18:56:16.330 回答
1

在 Java 7 中,您可以Stringswitch表达式中使用。参考这篇文章

switch (str) {
  case "blah":
    // some action
    break;
  case "beach":
    // another blah
    break;
  default:
    // default action
    break;
}
于 2013-03-15T18:56:55.863 回答
1

您的 if 语句似乎是解决此问题的最合乎逻辑的方法。不需要让你的生活变得复杂,只要保持简单。任何其他方法都有权衡和复杂性。


考虑使用 Map 和命令模式,如此处所示。您可以隐藏所有将关键字映射到功能,而不必使用ifor switch

于 2013-03-15T19:02:39.913 回答
1

一种方法是编写一个返回标记的解析器。令牌可以用整数或枚举表示。这会以您建议的方式模块化您的代码。

另一种方法是使用枚举。

public enum Token {

   FOO("foo", "f"),
   BAR("bar", "b");

   private String keyword;
   private String abbreviation;

   private Token(String keyword, String abbreviation) {
       this.keyword = keyword;
       this.abbreviation = abbreviation;
   }

   public String getKeyword() { 
       return this.keyword; 
   }
   public String getAbbreviation() { 
       return this.abbreviation;
   }

   public static Token valueOf(String s) {
       for (Token token : values()) {
           if (token.getKeyword().equals(s) || token.getAbbreviation().equals(s)) {
               return token;
           }
       }
       throw new IllegalArgumentException("No such keyword:  " + s);
   }
}

然后您可以执行以下操作:

switch (Token.valueOf(inputString)) {
    case BAR : doBarStuff(); return;
    case FOO : doFooStuff(); return;
}
于 2013-03-15T19:02:57.290 回答