2016-10-08 2 views
1

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

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 членов.

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

+0

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

ответ

4

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

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); 
     } 
+0

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

+1

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

1

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

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

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

+0

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

+0

нет его нет? или вы имеете в виду, что для группы 3 это должно быть иначе?в этом случае вам нужно написать новый func с помощью sig, как calculateSomething2 (groupx), и сделать 5-ю строку «= + 6» вместо 3 – tenshiman

+0

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

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 

     } 
    } 

для получения дополнительной информации visit this site

0

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

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; 
} 
1

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

Во-первых, укажите дополнительные точки декларативно.

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(); 
} 

Использование карты позволяет избежать даже один if и код простой и автоматически повторно потоком.

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

Смежные вопросы