Вставить параметр в зависимости от логического значения - PullRequest
0 голосов
/ 07 марта 2011

Можно ли вставить параметр в функцию в зависимости от логического значения?

Например, у меня есть этот кусок кода:

Math.min(boolA ? doubleValueA, boolB ? doubleValueB);

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 07 марта 2011

Используйте значение по умолчанию (например, Double.MAX_VALUE), если boolA или boolB равно false:

Math.min(
    (boolA) ? doubleValueA : Double.MAX_VALUE,
    (boolB) ? doubleValueB : Double.MAX_VALUE
);

Редактировать

Если у вас естьсписок переменных, для которых вы хотите найти минимум, но только если установлена ​​соответствующая логическая переменная, загрузите список в массив и найдите минимум:

ArrayList<Double> myArray = new ArrayList<Double>();
if (boolA) myArray.add(doubleValueA);
if (boolB) myArray.add(doubleValueB);
// etc

double minValue = Double.MAX_VALUE; // start with largest possible value
// loop through and replace with any smaller values
for (double val : myArray)
    if (val < minValue) minValue = val;
// val now contains the smallest value

Редактировать 2

Это также может применяться в целом к ​​другим функциям.Выборочно добавьте свои параметры в массив и передайте массив функции.Если у вас есть контроль над определением функции, вы можете использовать переменные аргументы , чтобы упростить ее.

public double MyMin(double... myArray) {
    double minValue = Double.MAX_VALUE; // start with largest possible value
    // loop through and replace with any smaller values
    for (double val : myArray)
        if (val < minValue) minValue = val;
    // val now contains the smallest value
    return val;
}
1 голос
/ 07 марта 2011

Java не имеет оператора, подобного

boolA ? doubleValueA

но поддерживает троичный оператор

boolA ? doubleValueA : defaultValue

это означает, что если boolA истинно, тогда используйте doubleValueA, в противном случае используйте defaultValue. В противном случае

Math.min(boolA ? doubleValueA, boolB ? doubleValueB);

будет бессмысленно, если boolA будет ложным (за исключением специальной обработки и, в данном случае, использования null, но Java - нет)

в целом, вы должны изменить на

Math.min(boolA ? doubleValueA : defaultA, boolB ? doubleValueB : defaultB);
0 голосов
/ 07 марта 2011
if(boolA && boolB) {
    Math.min(doubleA, doubleB);
} else if(boolA) {
    doubleA;
} else if(boolB) {
    doubleB;
} else {
    ????
}
0 голосов
/ 07 марта 2011

Если вы используете троичный оператор, вам нужно ложное условие. Скажем, вы хотите убедиться, что если boolA имеет значение false, doubleValueB будет иметь значение min, а если boolB имеет значение false, doubleValueA будет иметь значение min. Вы можете сделать другое условие максимальным целым числом, и тогда это будет так.

Конечно, если и boolA, и boolB имеют значение false, ваше значение будет максимальным целочисленным значением. Если это когда-нибудь случится, вам понадобится дополнительный код для его обработки.

Math.min(boolA ? doubleValueA : Integer.MAX_VALUE, boolB ? doubleValueB : Integer.MAX_VALUE);

Обратите внимание, что Math.min (int, int) не принимает varargs. Если вы хотите использовать список аргументов переменной длины, как описано здесь , вам понадобится ваша собственная функция min с varargs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...