Проверка ввода для элементов в массиве строк в Java - PullRequest
3 голосов
/ 23 января 2012

У меня есть следующий код, над которым я работаю в колледже.Меня просят использовать массивы, которые я использую.Меня просят использовать for-loop и if-Statement, которые я уже делаю.Я придумал следующий код:

class HardwareStore2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.printf("%55s", "**WELCOME TO THE HARDWARE STORE**\n");
        System.out.printf("%55s", "=================================\n");

        String [] codes = {"G22", "K13", "S21", "I30"};
        String [] description = {"STICKY Construction Glue", "CAR-LO Key Ring", "SCREW-DUP Screwy Screws", "LET-IT-RAIN Padlock"};
        List<String> codeList = Arrays.asList(codes);
        String output = "";
        int i = 1000;
        String [] userCode = new String[i];
        char dolSymb = '$';
        int [] pricesAndTax = {10989, 5655, 1099, 4005, 20};
        int [] weight = {};
        int [] userQuantity = {1};
        int [] userPrice = new int[i];
        int userStickyPrice = 0;
        int userKeyringPrice = 0;
        int userScrewyPrice = 0;
        int userPadlockPrice = 0;
        int userPreWithTax = 0;
        int userTotal = 0;
        int userPreTotal = 0;
        int userShipping = 0;

        System.out.printf("%-10s%-40s%-15s%-10s\n", "CODE", "DESCRIPTION", "WEIGHT", "PRICE\n");
        System.out.printf("%-10s%-55s%s%d.%02d\n", codes[0], description[0], dolSymb, pricesAndTax[0]/100, pricesAndTax[0]%100);
        System.out.printf("%-10s%-55s%s%d.%02d\n", codes[1], description[1], dolSymb, pricesAndTax[1]/100, pricesAndTax[1]%100);
        System.out.printf("%-10s%-55s%s%d.%02d\n", codes[2], description[2], dolSymb, pricesAndTax[2]/100, pricesAndTax[2]%100);
        System.out.printf("%-10s%-55s%s%d.%02d\n", codes[3], description[3], dolSymb, pricesAndTax[3]/100, pricesAndTax[3]%100);

        System.out.println("PLEASE ENTER YOUR ORDER:");
        System.out.print("NAME: ");
        String username = in.nextLine();
        System.out.print("ADDRESS Line 1: ");
        String address1 = in.nextLine();
        System.out.print("ADDRESS Line 2: ");
        String address2 = in.nextLine();
        System.out.print("POSTAL CODE: ");
        String postalcode = in.nextLine();

        for (i = 0;; i++) {
            System.out.print("CODE (X to QUIT):");
            userCode[i] = in.nextLine();

            if (userCode[i].equalsIgnoreCase("x")) {
                break;
            }

            System.out.print("QUANTITY: ");
            userQuantity[i] = in.nextInt();
            in.nextLine();

            if (userCode[i].equalsIgnoreCase(codes[0])) {
                userStickyPrice += userQuantity[i]*pricesAndTax[0];

            }
            else if (userCode[i].equalsIgnoreCase(codes[1])) {
                userKeyringPrice += userQuantity[i]*pricesAndTax[1];

            }
            else if (userCode[i].equalsIgnoreCase(codes[2])) {
                userScrewyPrice += userQuantity[i]*pricesAndTax[2];

            }
            else if (userCode[i].equalsIgnoreCase(codes[3])) {
                userPadlockPrice += userQuantity[i]*pricesAndTax[3];

            }
            else if (!codeList.contains(userCode)) {
                i = i - 1;
            }
        }
     }
}

Теперь все работает без проблем с миллионами ifs и elses, но я хочу знать, есть ли способ заменить все if-else-ifутверждения с одним или двумя, которые делают что-то вроде этого:

if (userCode[i].contains(codes[0], codes[1], codes[2], codes[3] {}

Или, может быть, что-то лучше, например:

if (userCode.contains(any.one.item.in.codeList) {
    then.get.the.price.of.that.item.and.do.item.specific.operations
    }

Пожалуйста, дайте мне знать, если вопрос недостаточно ясенИ еще раз, это задание колледжа, поэтому я был бы признателен за объяснения.

Ответы [ 4 ]

4 голосов
/ 23 января 2012

Не изменяя остальные структуры данных на что-то более эффективное (скажем, Map), вы можете достичь того же эффекта с помощью одного if и вложенного цикла:

boolean found = false;
for (int j = 0 ; !found && j != codes.length ; j++) {
    if (userCode[i].equalsIgnoreCase(codes[j])) {
        userScrewyPrice += userQuantity[i]*pricesAndTax[j];
        found = true;
    }
}
if (!found) {
    i--;
}
2 голосов
/ 23 января 2012

Я не прочитал полный вопрос, так что это может быть только частичный ответ ... но вы спрашиваете, можете ли вы использовать:

if (userCode[i].contains(codes[0], codes[1], codes[2], codes[3] {}

Вы можете использовать что-то вроде ...

if(new string[]{"a","b","c"}.Contains("a")) {}

или поместить это в пользовательские типы массивов ...

arrayType[] a = new arrayType[]{item1, item2, item3}
if (arrayType.Contains(searchItem)) {}

В основном - вы можете делать то, что просили, просто нужно изменить порядок синтаксиса. Но это, я уверен, только часть ответа, чтобы заставить вас задуматься.

2 голосов
/ 23 января 2012

Переменная codeList - это List, и она имеет функцию contains, которая может быть полезна, если я пойму, что вы пытаетесь сделать.

Кроме того, поскольку Java 7 вы можетеиспользуйте строки в качестве аргумента switch операторов, и это сделает ваш код лучше.

1 голос
/ 23 января 2012

Каждый раз, когда у вас есть несколько операторов «if», вы должны также использовать вместо них оператор «switch».

Похоже, оператор switch сохранил бы здесь довольно много строк.

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