簡體   English   中英

簡化或減少 if 語句

[英]Simplify or reduce if statement

我想通過用開關或 function 替換它們來減少 If 的數量,這可能嗎? 由於我的代碼太長,我認為 function 可以比重復的 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);
        }

您始終可以使用循環(或 stream,具體取決於性能要求):

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),則當前代碼的行為不明確。 output 是“檢測器 1”,但“檢測器 2”也是最大值。

如果您的列表可以包含多個最大值並且您想找到所有最大值,則需要稍微更改循環(但您現有的代碼只找到“第一個”值的 position)。

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

功能風格:

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

將使用任意數量的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM