【问题标题】:How to add a String Array item in Java's Switch's Case Value?如何在 Java Switch Case Value 中添加字符串数组项?
【发布时间】:2019-08-10 23:52:47
【问题描述】:

我们知道,从 Java 7 开始,Switch 的表达式可以是字符串。所以我正在制作一个应用程序,当用户选择一个类别时,他/她将根据类别值被分配到相关部门。这是代码:-

    public class Selector {
    ///String array to save the departments
    private final static String[] DEPTS = {
            "A",
            "B",
            "C",
            "D"
    };

    //String array for the categories
    private final static String[] CATEGORY = {
            "Wind",
            "Air",
            "Fire",
            "Cloud",
            "River",
            "Tree",
            "Abc",
            "Def"
    };

    //return the department when user selects a particular category item from above
    public static String setDepartment(String category) {
        switch(category){
            case "Wind":
                return DEPTS[0];
            case "Air":
                return DEPTS[1];
            case "Fire": case "Cloud": case "River":
                return DEPTS[2];
            case "Tree": case "Abc": case "Def":
                return DEPTS[3];            
        }
        return null;
    }
}

所以我在想如何使用部门的数组索引返回部门项目,我可以在案例值中使用相同的东西,比如,

case CATEGORY[0]: case CATEGORY[1]: 
     return DEPTS[2];

原因如果类别项目包含一个大字符串,那么案例将变得太长而无法写入。如果java不允许这样做,你能建议一些其他的方法,这样我的代码就不会变得麻烦吗?谢谢。

【问题讨论】:

  • 您可以使用常量Map<List<String>, String> 来存储您的键值映射,迭代键集中的Lists 以搜索与输入匹配的任何匹配项并返回关联的值。一些键将是 1 号 Lists。
  • case 中只允许使用常量。
  • 只需为该任务创建一个映射。您可以使用 MAP 作为示例。

标签: java arrays string switch-statement


【解决方案1】:

你为什么不使用枚举来做到这一点。

public class Selector {

  private enum DepartmentCategory = {
    Wind("A"),
    Air("B"),
    Fire("C"),
    Cloud("C"),
    River("C"),
    Tree("D"),
    Abc("D"),
    Def("E");

    private String department;

    DepartmentCategory(String department) {
      this.department = department;
    }
    public String getDepartment() {
      return department;
    }
  };
}

现在如果给你一个部门,你可以通过以下代码轻松获取类别。

String category = "Wind";
DepartmentCategory dc = DepartmentCategory.valueOf(category);
dc.getDepartment(); // Returns the department

【讨论】:

  • 感谢您在这种情况下使用枚举的建议。它对我有用。
【解决方案2】:

您可以使用Map<String, String> 将类别映射到部门。

然后,您必须使用map.get(category) 而不是开关,这将返回部门。

您可以将其设为Map<String, List<String>> 以将部门映射到类别,然后执行

for(String dept : map.keySet())
{
  if(map.get(dept).contains(category))
  {
    return dept;
  }
}

编辑:使用枚举,如果将来没有额外的部门或类别,那效果很好。地图允许更动态的方法。如果使用正确,两者都可以正常工作

【讨论】:

  • 这种方法对我来说似乎更有效。我一定会试试这个。感谢您的建议。
【解决方案3】:

我会使用 Map<String, String> 来存储部门和类别之间的关联,而不是 switch 语句。看来您正试图将 Array[] 用于非预期目的。

如果您使用Map<String, String>,那么您可以按如下方式存储您的数据:

Map<String, String> departments = new HashMap<String, String>();
departments.add("Wind", "A")
departments.add("Fire", "B")
departments.add("Fire", "C")
departments.add("River", "C")
departments.add("Cloud", "C")

然后您可以使用以下语法轻松检索部门名称:

String category = "Cloud"
String department = departments.get(category)

如果要关联多个部门,可以使用Map&lt;String, List&lt;String&gt;&gt; 表示一个类型和类别与多个部门之间的关系。

传统上,如果您考虑在数据库中表示这一点,您将使用带有索引和下方对象的地图。

我认为您不想在您的情况下使用数组来执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 2012-05-01
    • 1970-01-01
    • 2012-02-25
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多