Как добавить элемент String Array в значение регистра Switch в Java? - PullRequest
0 голосов
/ 20 марта 2019

Мы знаем, что начиная с 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 не позволяет этого, можете ли вы предложить другой способ, чтобы мой код не стал громоздким? Спасибо.

Ответы [ 3 ]

6 голосов
/ 20 марта 2019

Почему бы вам не использовать enum для этого.

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
1 голос
/ 20 марта 2019

Вы можете использовать Map<String, String> для сопоставления категории с отделом.

Тогда вместо переключателя вам придется использовать map.get(category), который вернет отдел.

Вы можете сделать это Map<String, List<String>>, чтобы сопоставить отдел с категориями, и сделать

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

Редактировать: с перечислениями, это хорошо работает, если не будет никаких дополнительных отделов или категорийв будущем.Карта позволяет более динамичный подход.Оба работают хорошо, если используются правильно

0 голосов
/ 20 марта 2019

Я бы использовал Map<String, String>, чтобы хранить ваши связи между отделом и категорией, а не операторы переключения. Похоже, вы пытаетесь использовать массив [] для целей, для которых он не предназначен.

Если вы используете 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<String, List<String>> для представления взаимосвязи между типом и категорией и несколькими отделами.

Традиционно, если вы думаете о представлении этого в базе данных, вы будете использовать карту с индексом и объектом под ним.

Я не думаю, что вы хотите использовать массивы для этого в вашем случае.

...