Java: математическое состояние - PullRequest
1 голос
/ 17 сентября 2009

Есть ли простой способ сделать это

if (1 < x && x < 3) { .... }

Я хочу что-то вроде этого:

if (1 < x < 3) { .... }

Я знаю, что приведенный выше код неверен, но ....

Спасибо

Ответы [ 6 ]

6 голосов
/ 17 сентября 2009

Предположим, вы говорите о целых числах:

if ( x == 2 ) { .... }

Есть немало маленьких кусочков Java, которые являются лучшим C ++ - в C или C ++ есть автоматическое преобразование между логическими значениями и целыми числами, поэтому в C ++:

int x = 5;

std::cout << std::boolalpha;

std::cout << ( 1 < x < 3 ) << std::endl;
std::cout << ( ( 1 < x ) < 3 ) << std::endl;

напечатает «true» дважды, так как ( 1 < x ) оценивает как 1, а 1 меньше 3. Java концентрируется на исправлении этой неоднозначности, анализируя два бинарных оператора, делая неконвертируемые булевы и целочисленные типы, поэтому вам нужно присоединиться к ним с другим оператором; другие языки не пытаются исправить C ++, но имеют более сложные правила синтаксического анализа, так что _ <_ <_ является троичным оператором, который делает правильные вещи. </p>

6 голосов
/ 17 сентября 2009

К сожалению, вы не можете сделать это в Java. Однако вы можете создать класс, скажем MathUtils, с помощью метода isBetween, например:

public static boolean isBetween(int n, int begin, int end) {
  return n > begin && n < end;
}

Тогда вы можете использовать (при условии, что вы import static):

if (isBetween(x, 1, 3)) {
  // ...
}

Но это было бы полезно, если у вас много условий .

3 голосов
/ 17 сентября 2009

У вас самая простая форма с точки зрения прямого синтаксиса Java. Вы можете ввести метод, если хотите:

public static boolean isBetween(int x, int min, int max) {
    return min < x && x < max;
}

, затем назовите его с помощью:

if (isBetween(x, 1, 3))

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

3 голосов
/ 17 сентября 2009

С точки зрения эффективности, (1 < x && x < 3) так же хорош, как вы получите. Чтобы поместить целое число в диапазон, вам нужно сделать два сравнения.

Если вы хотите сделать ваш код более читабельным, и у вас много этих диапазонов, вы можете рассмотреть возможность создания класса Interval с функцией contains ().

3 голосов
/ 17 сентября 2009

Не используется встроенная языковая поддержка; вам нужно пойти с вашим первым ответом.

Несколько библиотек позволят вам сделать что-то вроде следующего:

Range range = new ExclusiveRange(1,3);
if (range.contains(x)) { ... }
1 голос
/ 17 сентября 2009

Это утверждение с использованием && - самое простое, что вы можете получить. Ява, как и любой другой язык в стиле C, который я знаю, поддерживает цепные неравенства.

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