Упростить или уменьшить оператор if

#java #android-studio

#java #android-studio

Вопрос:

Я хочу уменьшить количество If, заменив их переключателем или функцией, возможно ли это?? поскольку мой код слишком длинный, я думаю, что функция может выполнить эту работу лучше, чем повторяющееся if или else, и это также будет более понятным.

  double a = text.charAt(39), b= text.charAt(40), c= text.charAt(41), d= text.charAt(42) ;
       Collection<Double> list=new ArrayList<Double>();
        list.add(a);
        list.add(b);
        list.add(c);
        list.add(d);
        if ( a>=15||b>=15||c>=15||d>=15) {
            if (  Collections.max(list) == a) {
                Defauts_detecteur.setText("Défauts récurrents constatés sur le détecteur 1");
            }
            else if ( Collections.max(list) == b)
            {
                Defauts_detecteur.setText("Défauts récurrents constatés sur le détecteur 2");
            }
            else if ( Collections.max(list) == c )
            {
                Defauts_detecteur.setText("Défauts récurrents constatés sur le détecteur 3");
            }
            else
            {
                Defauts_detecteur.setText("Défauts récurrents constatés sur le détecteur 4");
            }

            Conseil_detecteur.setText("--> Par mesure de sécurité, nous vous conseillons vivement de vérifier que le détecteur est bien collé au produit à sécuriser.nPour une adhésion optimale, remplacez l’adhésif.nVérifiez que le détecteur est bien connecté à la centrale et qu’il est en bon état.");

        }
        else {
            Conseil_detecteur.setText("--> Des alarmes régulières ? Envie d'en savoir plus ?nContactez notre hotliner au 02 37 33 69 66 qui vous guidera dans leurs résolutions.");
            Defauts_detecteur.setVisibility(View.GONE);
        }
 

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

1. Ваш внутренний else действительно else или это max(list) == d тоже должно быть?

2. операторы switch case всегда хотят использовать число в качестве параметра, switch(id) case 4: … если ваше тело if содержит только один оператор, вы можете записать его БЕЗ скобок ( { )

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

4. text.charAt() дает вам символ в этой позиции, а не двойное значение (измерение?). Так "abc123".charAt(0) что дает 97 , «.charAt(3)` дает 49 . Это предназначено?

5. Также обратите внимание, что сравнение удвоений по == может не сработать.

Ответ №1:

Вы всегда можете использовать цикл (или поток, в зависимости от требований к производительности):

 final double a = text.charAt(39), b = text.charAt(40), c = text.charAt(41), d = text.charAt(42) ;
final List<Double> list = Arrays.asList(a, b, c, d); // note that an array (double[]) instead of a collection would avoid boxing

final double maxValue = Collections.max(list);
if (maxValue >= 15) { // at least one value is greater than or equal to 15, no need to inspect each element individually
   for (int i = 0; i < list.size();   i) {
      if (list.get(i) == maxValue) {
        Defauts_detecteur.setText("Défauts récurrents constatés sur le détecteur "   (i 1));
        break; // stop after first matching value was found
      }
   }

   Conseil_detecteur.setText("--> Par mesure de sécurité, nous vous conseillons vivement de vérifier que le détecteur est bien collé au produit à sécuriser.nPour une adhésion optimale, remplacez l’adhésif.nVérifiez que le détecteur est bien connecté à la centrale et qu’il est en bon état.");
} else {
   Conseil_detecteur.setText("--> Des alarmes régulières ? Envie d'en savoir plus ?nContactez notre hotliner au 02 37 33 69 66 qui vous guidera dans leurs résolutions.");
   Defauts_detecteur.setVisibility(View.GONE);
}
 

Обратите внимание, что ваш текущий код имеет неясное поведение, если два значения идентичны и максимальны (например, a = 16, b = 16, c = 12, d = 9). Выводом является «детектор 1», но «детектор 2» также является максимальным.

Если ваш список может содержать несколько максимальных значений, и вы хотите найти их все, вам нужно немного изменить свой цикл (но ваш существующий код нашел только позицию «первого» значения).

 final List<Integer> maxPositions = new ArrayList<>();
for (int i = 0; i < list.size();   i) {
  if (list.get(i) == maxValue) {
    maxPositions.add(i 1);
    // don't stop, keep going
  }
}

// will print e.g. "found at positions [1, 4]
….setText("Max values found at positions "   maxPositions);
 

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

1. Как это можно решить в этом случае, если у меня есть два одинаковых максимальных значения?

2. @Antoine я не знаю. Я не знаю, каковы ваши ожидания. Вы хотите найти позиции всех наибольших значений в вашем списке? Или первое по величине значение? Или последнее наибольшее значение?

3. Я хочу найти позицию наибольшего значения, превышающего 15, и в случае, если 2 или 3 значения равны и превышают 15, я тоже хочу их найти.

4. Вы хотите найти позицию, а не значение, правильно?

5. Да, я хочу найти позицию максимального (и превышающего 15) значения. и затем я помещаю позицию этого значения в текст ниже.

Ответ №2:

Функциональный стиль:

     HashMap<Character, Integer> values = new HashMap<>();
    values.put('a', 239);
    values.put('b', 123);
    values.put('c', 345);
    values.put('d', 555);

    Optional<Map.Entry<Character, Integer>> max = values.entrySet().stream().filter(e -> e.getValue() > 15).max(Map.Entry.comparingByValue());
    max.ifPresent(characterIntegerEntry -> System.out.println(" max entry value for detector "   characterIntegerEntry.getKey()   " is"   characterIntegerEntry.getValue()));
 

будет работать с произвольным объемом данных.

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

1. switch не может работать с непостоянными значениями.

2. Проблема с switch здесь заключается в том, что метки переключателей должны быть буквальными / постоянными значениями. Здесь это не так