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