simplify或reduce if语句

dsekswqp  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(303)

我想通过一个开关或一个函数来替换它们来减少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);
        }
7rtdyuoh

7rtdyuoh1#

始终可以使用循环(或流,具体取决于性能要求):

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

请注意,如果两个值相同且为max(例如a=16、b=16、c=12、d=9),则当前代码的行为不明确。输出为“探测器1”,但“探测器2”也是最大值。
如果您的列表可以包含多个max值,并且您希望找到所有max值,那么您需要稍微更改您的循环(但是您现有的代码只找到了“first”值的位置)。

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);
siv3szwd

siv3szwd2#

功能风格:

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

将处理任意数量的数据。

相关问题