Я пытаюсь создать код, который принимает количество товаров, купленных покупателем, а затем распечатывает, на сколько будет скидка.

1-3 items purchased will get no discount
4-6 items purchased will get 5% discount
7-10 items purchased will get 10% discount
11 or more items purchased will get a 15% discount

Любая помощь будет оценена, спасибо. Вот код, который я создал.

package discount;
import java.util.Scanner;

public class Discount {

    public static void main(String[] args) {    
        Scanner input = new Scanner(System.in);
        System.out.println("Input the number of items: ");
        int quantity = input.nextInt();
                
        int[] discount = {0, 5, 10, 15};
        
        if (quantity >= 1 && quantity <4){
            System.out.print("no discount");
        } else if (quantity >= 4 && quantity <7){
            System.out.print(discount[1] + "% discount");
        } else if (quantity >= 7 && quantity <11){
            System.out.print(discount[2] + "% discount");
        } else if (quantity >= 11){
            System.out.print(discount[3] + "% discount");
        }     
    }
}
-1
javaCoder 19 Янв 2022 в 05:22
В этом случае сработает оператор switch. См. docs.oracle.com/javase/tutorial/java/nutsandbolts/switch. .html. Если было слишком много меток case для перечисления, то класс TreeMap является альтернативой.
 – 
Stephen C
19 Янв 2022 в 05:25
1
Я согласен с вышеизложенным, но приведенный выше код еще не является тем, что я бы назвал «длинным». Он не очень хорошо отформатирован, но я могу исправить это для вас.
 – 
Hovercraft Full Of Eels
19 Янв 2022 в 05:26
Согласованный. Сомнительно, чтобы этот код был короче.
 – 
Stephen C
19 Янв 2022 в 05:34
Спасибо за комментарий! Можете ли вы научить меня, как я могу сделать его хорошо отформатированным?
 – 
javaCoder
19 Янв 2022 в 05:40
Упрощение состояло бы в том, чтобы удалить массив discount и вместо этого использовать литералы в телах операторов if. Преимущество этого заключается в том, что вы можете сразу увидеть, какое количество связано с какой скидкой, и исключает возможность наличия индекса массива в операторе if, которого нет в discount. Однако это изменение противоречит цели изучения Java, и я надеюсь, что вы получили и исправили хотя бы один ArrayIndexOutOfBoundsException, работая над этим кодом!
 – 
tgdavies
19 Янв 2022 в 06:11

3 ответа

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

<сильный>1. Рассчитать скидку:

public static int getDiscount(int items) {
    return switch(items) {
        case 0, 1, 2, 3 -> 0;
        case 4, 5, 6 -> 5;
        case 7, 8, 9, 10 -> 10;
        default -> 15;
    };
}

<сильный>2. Распечатайте сообщение:

public static void printMessage(int discount) {
    switch(discount) {
        case 0 -> System.out.print("no discount");
        default -> System.out.println(discount + "% discount");
    }
}

<сильный>3. главное:

public static void main(String[] args) {    
    Scanner input = new Scanner(System.in);
    System.out.println("Input the number of items: ");
            
    printMessage(getDiscount(input.nextInt()));
}
  • Этот код будет работать с Java 14 и выше.
1
Alexander Ivanchenko 19 Янв 2022 в 06:46
Это не будет работать с Java 11 или более ранней версией. (Или на Андроиде). Выражения-переключатели — это новая функция языка...
 – 
Stephen C
19 Янв 2022 в 05:36
Правильно, это будет работать только с последней LTS-версией Java.
 – 
Alexander Ivanchenko
19 Янв 2022 в 05:42

Без Kotlin when Java switch может делать, а может и не делать все, что вам нужно. Но если вы хотите писать с помощью if-else, он может очистить:

if(quantity > 0){ 
    int discount = -1
    if(quantity < 4) discount = 0; 
    else if (quantity < 7) discount = 5; 
    else if (quantity < 11) discount = 10;
    else discount = 15; 
    printDiscountMessage(discount)
}

0
clwhisk 19 Янв 2022 в 07:26

Вы можете обойтись без половины многих ваших операторов if (вам не нужна проверка нижних границ)

    if (quantity <4){
    System.out.print("no discount");
    }
    
    else if (quantity <7){
    System.out.print(discount[1] + "% discount");
    }
    
    else if (quantity <11){
    System.out.print(discount[2] + "% discount");
    }
-1
ControlAltDel 19 Янв 2022 в 05:28
Это неправильно. Что делать, если количество >= 11. Предполагается, что это скидка 15%, но ваша версия ничего не печатает. Аналогично, как насчет количества <= 0 ? Ничто не мешает пользователю ввести ноль или отрицательное число.
 – 
Stephen C
19 Янв 2022 в 05:30
Я не включил >= 11, так как не менял его. Поскольку количество < 0, это не определено в поставленной задаче, поэтому я это тоже не проверяю.
 – 
ControlAltDel
19 Янв 2022 в 05:36