#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 здесь заключается в том, что метки переключателей должны быть буквальными / постоянными значениями. Здесь это не так