Shopping Lists проблем с тестовете

preparation

#1

Здравейте,

Опитвам да реша задачата от заглавието, но ми връща - IR (java.lang.NumberFormatException) за всички unit тестове, без първият.
За форматиране ползвам следният код:

System.out.printf("%.2f", orderTotal);

Някой знае ли, как правилно да форматираме дабълите? Благодаря

EDIT: Оказа се, че грешката е, защото се опитвам да парсна стринг към число.

EDIT2: Някой може ли да ми каже, какъв 2-рия тест? Искам да видя, какво пропускам, че да ми хвърля такава грешка. Опитах и с regex, в случай, че имената на продуктите са от повече от 2 думи. Може да са и от 1000 думи. Няма да има проблем. Обаче с regex направо ми каза WA на всички тестове без първия.


#2

Здравей, Станислав,
Можеш ли да споделиш регулярния израз, който използваш? Не зная дали ще мога да помогна с този подход - аз използвам последна позиция на интервала при обработването на списъка с цените, и опит за четене на цяло число в началото на всяка инструкция от списъците с покупките (ако опитът се провали, числото се приема за 1). По този начин вторият тест и следващите тестове, за които досега ми е стигало времето за изпълнение, минават.
Поздрави,
Иван


#3

Здрасти,

Pattern productPattern = Pattern.compile("([a-zA-Z ]+)([0-9\\.]+)");

Това е за продуктите, когато ги записвам в HashMap.

                Pattern manyProductCountPattern = Pattern.compile("(\\d) ([a-zA-Z ]+)");
                Pattern oneProductCountPattern = Pattern.compile("([a-zA-Z ]+)");

Това са двата случая, когато нямам посочено количество от продукта (т.е. бройката е една) или когато имам повече от една.


#4

Регулярният израз "(\\d) ([a-zA-Z ]+)" допуска само една цифра, последвана от интервал, като начало на стринга, което ще бъде проблем, ако количествата на продуктите са многоцифрени числа.


#5

Прав си. Обаче пак не мина. На мен това ми е логиката за сплит на поръчка с точната бройка, като използвам след това да намеря цената и да умножа по количеството:

for (int j = 0; j < orderProducts.length; j++) {

                String[] orderTokens = orderProducts[j].split(" ");

                String orderProductName = "";
                int orderProductCount = 1;

                if (orderTokens.length == 3){
                    orderProductName = orderTokens[1] + " " + orderTokens[2];
                    orderProductCount = Integer.parseInt(orderTokens[0]);
                } else if (orderTokens.length == 2){

                    Pattern pattern = Pattern.compile("\\d+");
                    Matcher matcher = pattern.matcher(orderTokens[0]);

                    if (matcher.matches()){
                        orderProductCount = Integer.parseInt(orderTokens[0]);
                        orderProductName = orderTokens[1];
                    } else {
                        orderProductName = orderTokens[0] + " " + orderTokens[1];
                    }

                } else if (orderTokens.length == 1){
                    orderProductName = orderTokens[0];
                }

                if (products.containsKey(orderProductName)){

                    Double productPrice = products.get(orderProductName);

                    orderTotal += productPrice * orderProductCount;
                }
            }

Вижда се, че допускам, че името на продукта е от най-много две думи. Не знам вече, какво точно пропускам.


#6

А какво става, ако е от повече? :slight_smile: