использование Math.max для замены только отрицательных чисел

#java

#java

Вопрос:

Я нахожусь в процессе создания программы, которая вычисляет на основе пользовательского ввода и должна изменять отрицательные числа на значение по умолчанию без использования «операторов if» или «:?». Я пытался использовать Math.max(input, 1), однако это создает проблему для значений от 0 до 1. Какие-либо рекомендации?

Комментарии:

1. Итак, вы хотели бы сопоставить -0.5 с 1, но 0.5 должно оставаться как 0.5?

2. @JonSkeet да. Это цель.

3. И есть ли какая-либо веская причина, по которой вы не можете использовать ни if , ни оператор conditional ?: ? Вероятно, это будет намного проще, чем все остальное, что мы можем придумать.

4. Но почему? Часто что-то указывается как требования, которые имеют некоторую основную причину, которую можно скорректировать. Это действительно странное требование — не иметь возможности использовать условный оператор ?: .

5. Правильно, значит, это домашнее задание. Когда возникают необычные требования, всегда стоит одновременно объяснить причину этих требований. (Часто причина может исключать и другие варианты, например.) Я должен сказать, что это действительно не хорошее назначение, если все, что мы можем сделать, это вызывать методы и использовать арифметику. Я не думаю, что это учит вас чему-то особенно полезному — просто действительно запутанным способам решения задач, к которым гораздо лучше подходить по-другому.

Ответ №1:

Может быть, глупое решение, но попробуйте это:

 while (input < 0)
  input = 1;
  

Комментарии:

1. Спасибо за предложение, однако это не то, что я ищу.

2. @user11231654 Тогда каковы ваши явно невыразимые критерии …? Это делает именно то, что вы хотели, даже принимая во внимание глупые ограничения.

3. Критерием для программы является то, что она просто должна заменить отрицательные значения значением по умолчанию. Хотя я знаю, что ваше предложение является возможным решением, было предложено использовать Math.max в сочетании с абсолютными значениями для достижения результата.

Ответ №2:

Ладно, я могу придумать один действительно ужасный способ сделать это. Он основан на использовании Math.signum , которое возвращает -1.0 для отрицательного ввода, 1.0 для положительного ввода и 0 для нулевого ввода. Мы можем использовать Math.min(Math.signum(input, 0)) , чтобы получить -1.0 для отрицательного ввода и 0 для нулевого или положительного ввода.

Таким образом, мы можем свести входные данные к минимуму, равному нулю, затем вычесть это «-1.0 или 0», чтобы избежать изменения любого неотрицательного входного значения, но преобразовать отрицательный входной сигнал в 1.

Вот полный код для этого:

 public class Test {
    public static void main (String[] args) {
        testValue(-1.5);
        testValue(-0.5);
        testValue(0);
        testValue(0.5);
        testValue(1.5);
    }

    private static void testValue(double input) {
        double result = transformInput(input);
        System.out.println(input   " -> "   result);
    }

    private static double transformInput(double input) {
        double clampedValue = Math.max(input, 0);
        double clampedSign = Math.min(Math.signum(input), 0);
        return clampedValue - clampedSign;
    }
}
  

Но, как я отметил в комментариях, это ужасный вопрос, который намного лучше решается с помощью ?: оператора, и я сомневаюсь в мудрости того, кто назначил вам это назначение.

Комментарии:

1. Спасибо за вашу помощь. Это кажется разумным решением.

2. @user11231654 но, пожалуйста, никогда не используйте этот стиль в реальном коде, это почти невозможно понять без некоторых временных усилий / тестирования / комментариев. (несмотря на хорошее именование переменных / методов). Решение с использованием if было бы настолько простым и в основном понятным любому… (Кстати, я почти уверен, что это signum менее известно, чем if )

3. @CarlosHeuberger: Я бы сказал, что ?: оператор был бы еще проще: double result = input < 0 ? 1 : input;

4. конечно, но я избегал этого (в комментарии), поскольку это непонятно некоторым (не-) программистом

Ответ №3:

Определенно не так чисто, как я хочу (даже мне не нравится, насколько это запутанно), но это работает 😉

 Math.round(((Math.max(input 1, 1)-Math.signum(input Math.abs(input)))*100))/100.0
  

Ввод

5
0.5
0.3
-0.2
-0.5
-2

Вывод

5.0
0.5
0.3
1.0
1.0
1.0

Комментарии:

1. Спасибо за помощь.

Ответ №4:

Вместо использования Math.max(..,..) вы можете создать свой собственный метод для реализации вашей логики и возврата желаемого результата, как показано ниже.

   public static double mapInput(double input) {

    return Math.max(input, (input < 0 ? 1 : input));
  }
  

Комментарии:

1. Вы используете троичное число, которое «не разрешено»

2. В требовании говорится without using "if statements "or ": ?"

3. Привет, спасибо за предложение, однако требуется заменить отрицательные значения значением по умолчанию без использования функции ?: . Было намекнуто, что использование Math.max в сочетании с Math.abs — это решение, которое соответствует правилам.

4. троичный не допускается, но в примере он использует функцию max класса Math, поэтому мы можем создать нашу собственную для реализации этой логики.