Делает решение if-else более эффективным, меньше строк кода (Java)

#java #if-statement #switch-statement #conditional

#java #оператор if #оператор switch #условное

Вопрос:

Есть ли более эффективный способ закодировать что-то подобное, не используя столько операторов if-else?

 private int group1, group2, group3, group4;
private int total = 0

public void assignMembers()
{
    group1 = (int)((6 * Math.random())   1);
    group2 = (int)((6 * Math.random())   1);
    group3 = (int)((6 * Math.random())   1);
    group4 = (int)((6 * Math.random())   1);
}

public void calculateSomething()
{
    if(group1 == 3)
    {
        total  = 2;
    }
    else if(group1 == 5)
    {
        total  = 4;
    }

    if(group2 == 3)
    {
        total  = 2;
    }
    else if(group2 == 5)
    {
        total  = 4;
    }

    if(group3 == 3)
    {
        total  = 2;
    }
    else if(group3 == 5)
    {
        total  = 4;
    }

    if(group4 == 3)
    {
        total  = 2;
    }
    else if(group4 == 5)
    {
        total  = 4;
    }
{
  

Операторы if-else добавляют два к общему числу, если в группе 3 члена, и 4, если в группе 5 членов.

Я знаю, что, возможно, смогу сделать что-то более эффективное с массивом «групп», но есть ли способ без массива? Может быть, способ для метода calculateSomething получить количество членов команды в каждой группе без необходимости повторять if-else так много? Любые предложения будут оценены.

Комментарии:

1. Вам также следует подумать о том, чтобы поместить все переменные вашей группы в массив (или список). Это упрощает выполнение действий со всеми из них путем перебора структуры данных и упрощает и повышает эффективность хранения большого количества переменных, если вам нужно больше 4.

Ответ №1:

Если вы, кажется, нашли избыточный шаблон в своем коде, это время, когда вы собираетесь создать повторно используемую функцию.

 private int group1, group2, group3, group4;
private int total = 0;

    public void assignMembers()
    {
        group1 = (int)(Math.random()*6   1);
        group2 = (int)(Math.random()*6   1);
        group3 = (int)(Math.random()*6   1);
        group4 = (int)(Math.random()*6   1);

        calc(group1);
        calc(group2);
        calc(group3);
        calc(group4);
    }

    public void calc(int group)
    {
        switch (group){
                case 3:
                  total  = 2;
                  break;
                case 5:
                  total  = 4;
                  break;
        }
    }
  

Обновить ответ — поскольку требования таковы: метод должен вызываться вне класса.

 private int group1, group2, group3, group4;
    private int total = 0;

        public void assignMembers()
        {
            group1 = (int)(Math.random()*6   1);
            group2 = (int)(Math.random()*6   1);
            group3 = (int)(Math.random()*6   1);
            group4 = (int)(Math.random()*6   1);
        }

        private void calc(int group)
        {
            switch (group){
                    case 3:
                      total  = 2;
                      break;
                    case 5:
                      total  = 4;
                      break;
            }
        }

        public void calculateSomething(){
            calc(group1);
            calc(group2);
            calc(group3);
            calc(group4);
        }
  

Комментарии:

1. Отличный ответ, спасибо! Что, если метод calc() вызывался из другого класса, который нельзя изменить, и у него нет параметров? Создаст ли проблемы наличие calc() в этом классе и calc(int group) в этом классе?

2. @Bluasul Я обновил свой ответ на основе ваших обновленных требований. Теперь вы можете вызвать его вне класса.

Ответ №2:

Поскольку в вашем коде есть избыточный шаблон

     private int group1, group2, group3, group4;
    private int total = 0;

    public void assignMembers()
    {
        group1 = randomGen();
        group2 = randomGen();
        group3 = randomGen();
        group4 = randomGen();

        function(group1);
        function(group2);
        function(group3);
        function(group4);
    }

    public int randomGen(){
        int x=(int)(Math.random()*6   1);
        return x;
    }
    public void function(int group)
    {
        switch (group){
                case 3:
                  total  = 2;
                  break;
                case 5:
                  total  = 4;
                  break;
                default:
                  // write here what you need to perform when the group value is 3 or 5

        }
    }
  

для получения дополнительной информации посетите этот сайт

Ответ №3:

предполагая, что вы пишете java, вы должны написать оператор case и передать каждую переменную в функцию. вы также должны определить total в первой функции, но я не буду показывать вам, как это сделать. в любом случае, что-то вроде этого, затем передайте ему каждую группу в цикле for:

 public int calculateSomething(groupx){
    switch (groupx) 
        {
            case 3:
            total  = 2;
            break;
            case 5:
            total  = 4;
            break;
        }
  

обратите внимание, что регистр не нуждается в скобках вокруг следующей строки.

Комментарии:

1. total увеличивается на 6, когда groupx равно 3.

2. нет, это не так? или вы имеете в виду, что оно должно быть другим для group3? в этом случае вам нужно написать новую функцию с сигналом типа calculateSomething2(groupx) и сделать 5-ю строку «= 6» вместо 3

3. @tenshiman Возможно, вы захотите освежить свои знания об switch/case операторе, особенно о том, что break делает a (и что происходит, если отсутствует).

Ответ №4:

Предпочитайте подход «данные», а не «код» для решения проблемы, ориентированной на данные.

Сначала определите дополнительные точки декларативно.

 private static Map<Integer, Integer> extras = new HashMap<Integer, Integer>() {{
    put(3, 2);
    put(5, 4);
}};
  

Обратите внимание, что это единственное место в коде, где появляются эти числа, и что изменить их или добавить больше просто, и очевидно, как это сделать.

Затем используйте поток для обработки всех групп в одной строке:

 public void calculateSomething() {
    total  = IntStream.of(group1, group2, group3, group4)
      .map(i -> extras.getOrDefault(i, 0))
      .sum();
}
  

Использование map позволяет избежать даже одного if , а код прост и автоматически повторно используется потоком.

Отказ от ответственности: код может не компилироваться или работать так, как он был введен на моем телефоне (но есть разумная вероятность, что он будет работать)

Ответ №5:

Попробуйте это.

 private int group1, group2, group3, group4;
private int total = 0;

public void assignMembers() {
    group1 = updateTotal((int) ((6 * Math.random())   1));
    group2 = updateTotal((int) ((6 * Math.random())   1));
    group3 = updateTotal((int) ((6 * Math.random())   1));
    group4 = updateTotal((int) ((6 * Math.random())   1));
}

int updateTotal(int group)
{
    total  = group == 3 ? 2 : group == 5 ? 4 : 0;
    return group;
}