• ,

.level18.lesson10.bonus02 ошибка валидатора

Добрый день!

Вопрос по валидатору:
почему решение является корректным, если добавить запись без перевода на новую строку?

т.е. вот такая запись «ПРАВИЛЬНАЯ» по мнению валидатора
19846 Шорты пляжные синие 159.00 12
198478 Шорты пляжные черные с рисунко173.00 17
19847983Куртка для сноубордистов, разм10173.99123419847984productName 1.234 5678

А вот так «Программа не прошла тестирование»
19846 Шорты пляжные синие 159.00 12
198478 Шорты пляжные черные с рисунко173.00 17
19847983Куртка для сноубордистов, разм10173.991234
19847984productName 1.234 5678

26 комментариев

MaxFrodo
Все сталкивались. Какие-то проблемы с сервером. Бету наверное опять новую заливают.
AlexSir
Спасибо. Буду ждать
MaxFrodo
Вроде заработало.
kulikovman
Только что проверил, у меня не работает.
AlexSir
Да. Система заработала.
ShitovRE
  • ShitovRE
  • 0
  • Комментарий отредактирован 2017-02-12 11:37:35 пользователем ShitovRE
Здравствуйте!
Я так понимаю, вы с этой задачей справились. Может посмотрите мою реализацию и скажите что там не нравиться валидатору?:
<code>package com.javarush.task.task18.task1827;

/* 
Прайсы
*/

import java.io.*;
import java.util.Locale;

public class Solution {
    static String formater = "%-8d%s"; //только для Unit.toString
    public static void main(String[] args) throws Exception {
        String fileName;
        String line;
        BufferedReader reader;
        //ввод имени файла
        reader = new BufferedReader(new InputStreamReader(System.in));
        fileName = reader.readLine();
        reader.close();
        //построчный ввод из файла без хранения. Для нахождения maxID
        reader = new BufferedReader(new FileReader(fileName));
        while ((line = reader.readLine()) != null)
            new Unit(line);
        reader.close();
        //Чтение строки параметров, сшивание строки для записи в файл
        if(args.length > 0) {
            if (args[0].equals("-c"))
            {
                StringBuilder sb = new StringBuilder();
                sb.append(argToSize(Integer.toString((Unit.maxId+1)), 8));  //id
                StringBuilder nameBuilder = new StringBuilder();
                for (int i = 1; i < (args.length - 2); i++) {
                    nameBuilder.append(args[i]);
                    if (i < args.length - 3)
                        nameBuilder.append(" ");
                }
                sb.append(argToSize(nameBuilder.toString(), 30));           //productName
                sb.append(argToSize(args[args.length-2], 8));               //price
                sb.append(argToSize(args[args.length-1], 4));               //quantity

                new Unit(sb.toString());
                FileWriter writer = new FileWriter(fileName, true);
                writer.write(sb.toString() + System.lineSeparator());
                writer.close();
            }
        }
    }

    static String argToSize(String arg, int size){
        //форматирует поля: обрезание, добавление пробелов, выравнивание
        String result;
        if (arg.length() > size)
            result = arg.substring(0, size);
        if (arg.length() < size)
            result = String.format("%-" + size +"s", arg);
        else
            result = arg;
        return result;
    }

    static class Unit {
        //создал сначала, чтобы хранить экземпляры в ArrayList.
        //В контектсе этой задачи, просто хранит maxID
        public static int maxId = 0;
        public int id;
        public String productName;

        public Unit(String strUnit) {
            this.id = Integer.parseInt(strUnit.substring(0, 8).trim());
            this.productName = strUnit.substring(8);
            maxId = maxId > this.id ? maxId : this.id;
//            System.out.println(this);
        }

        @Override
        public String toString() {
            return String.format(Locale.ENGLISH, formater, id, productName);
        }
    }
}</code>
ShitovRE
с переводами строки пробовал разные варианты: вначале строки, вконце строки, "\n", System.lineSeparator(). Уже задача превратилась из «реализуй то что задано» в «УГАДАЙ, что хотел автор»
AlexSir
1.У тебя в файл добавляет правильные данные, но в конце у тебя еще добавлен перевод на новую строку.
2. ты используешь ридер ( BufferedReader reader;) несколько раз. У меня некоторые задачи из-за этого тоже не принимались, т.е. открывал несколько ридеров и в конце закрывал.
Ryal
Смотрю на заголовок темы.
То есть пробелами добивать не надо данные что-ли тоже?
AlexSir
Пробелами надо и нужно, только перевод \n не надо делать.
т.е.
writer.write(sb.toString() + System.lineSeparator());
переделай в
writer.write(sb.toString());

По крайней мере у меня приняло
ShitovRE
Спасибо. Т.е. перевод строки должен быть вначале, все-таки? — это уже неопределенность на 50% уменьшит :)
AlexSir
Как у меня принял валидатор: 1. открыл файл на добавление 2. записал форматированную строку. 3. закрыл файл. БЕЗ: System.lineSeparator() — ни до, ни после.
на выходе:
19847983Куртка для сноубордистов, разм10173.99123419847984productName 1.234 5678

«5678 » — последние символы в файле, после них, никаких разделителей и переносов строки.
Archie369
Привет, если у тебя нормально приняло задачу, посмотри пожалуйста что с моим решением не так? Условие выполняется.
package com.javarush.test.level18.lesson10.bonus02;

/* Прайсы
CrUD для таблицы внутри файла
Считать с консоли имя файла для операций CrUD
Программа запускается со следующим набором параметров:
-c productName price quantity
Значения параметров:
где id - 8 символов
productName - название товара, 30 chars (60 bytes)
price - цена, 8 символов
quantity - количество, 4 символа
-c  - добавляет товар с заданными параметрами в конец файла, генерирует id самостоятельно, инкрементируя максимальный id, найденный в файле

В файле данные хранятся в следующей последовательности (без разделяющих пробелов):
id productName price quantity
Данные дополнены пробелами до их длины

Пример:
19846   Шорты пляжные синие           159.00  12
198478  Шорты пляжные черные с рисунко173.00  17
19847983Куртка для сноубордистов, разм10173.991234
*/

import java.io.*;
import java.util.Locale;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) throws Exception {
        String action = args[0];
        String productName = args[1];
        float price = Float.parseFloat(args[2]);
        int quantity = Integer.parseInt(args[3]);
        Scanner scanner = new Scanner(System.in);
        String fileName = scanner.next();
        scanner.close();
        File file = new File(fileName);
        if (action.equals("-c")) {
            add(file, productName, price, quantity);
        }
    }

    static void add(File file, String productName, float price, int quantity) {
        try {
            int id = 0;
            Scanner fileNameScanner = new Scanner(file);
            while (fileNameScanner.hasNextLine()) {
                id = Integer.parseInt(fileNameScanner.nextLine().substring(0, 8).trim());
            }
            fileNameScanner.close();
            PrintWriter printWriter = new PrintWriter(new FileOutputStream(file, true));
            printWriter.printf(Locale.US,"%n%-8d%-30s%-8.2f%d", id + 1, productName, price, quantity);
            printWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
}
AlexSir
Посмотрел (запустил), Ваше, решение.
на вход: -c productName 1.234 5678
Выход, только отличия от моего выхода:
1. 19847987productName 1.23 5678
обрезается 1.234 до 1.23
2. добавляет «x0Dx0A» (перевод строки) — перед выводом вашего резульата
Archie369
Спасибо!!! А вот этот код можете у себя проверить? Я убрал приведение типов, пишу теперь только строчки:
import java.io.*;
import java.util.Locale;
import java.util.Scanner;
public class Solution {
    public static void main(String[] args) throws Exception {
        String action = args[0];
        String productName = args[1];
        String price = args[2];
        String quantity = args[3];
        Scanner scanner = new Scanner(System.in);
        String fileName = scanner.next();
        scanner.close();
        File file = new File(fileName);
        if (action.equals("-c")) {
            add(file, productName, price, quantity);
        }
    }
    static void add(File file, String productName, String price, String quantity) {
        try {
            int id = 0;
            Scanner fileNameScanner = new Scanner(file);
            while (fileNameScanner.hasNextLine()) {
                int curID = Integer.parseInt(fileNameScanner.nextLine().substring(0, 8).trim());
                if  (curID > id){
                    id = curID;
                }
            }
            fileNameScanner.close();
            PrintWriter printWriter = new PrintWriter(new FileOutputStream(file, true));
            printWriter.printf(Locale.US,"%n%-8d%-30s%-8s%s", id + 1, productName, price, quantity);
            printWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
AlexSir
А второй пункт не убрали:
2. добавляет «x0Dx0A» (перевод строки) — перед выводом вашего результата

внимательно на формат посмотри "%n%-8d%-30s%-8s%s" — 5 параметров, "%n" — наверное лишний
Archie369
Если без %n, то данные все пишутся строчку, задача то требует чтобы мы с новой строки записывали данные
AlexSir
  • AlexSir
  • 0
  • Комментарий отредактирован 2017-02-20 11:15:10 пользователем AlexSir
в том, то и дело, что данные в файле хранятся в отдельных строках, а требуют добавить в конец файла (не на новой строке). у меня приняло без перевода. я писал об этом выше.
Посмотри название темы :)
Archie369
Спасибо! А вы в новой версии сайта или в старой проверяете?
AlexSir
  • AlexSir
  • 0
  • Комментарий отредактирован 2017-02-20 11:40:29 пользователем AlexSir
Мое решение проверялось старым валидатором.
А Ваш код, проверял со своим результатом, т.к. в обновлении ни слово про проверку данной задачи. На новом валидаторе, не тестировал данную задачу.
Приняло?
Archie369
В новом сайте просто висит и все, бесконечное "
Подождите пока задача выполняется... "
вечером проверю через старый плагин, отпишусь.
Archie369
убрал новую строчку, все равно не принмает задачу, у вас может быть еще варианты будут?)
AlexSir
выложи решение с импортами
Archie369
полный код:

import java.io.*;
import java.util.Locale;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) throws Exception {
        String action = args[0];
        String productName = args[1];
        String price = args[2];
        String quantity = args[3];
        Scanner scanner = new Scanner(System.in);
        String fileName = scanner.next();
        scanner.close();
        File file = new File(fileName);
        if (action.equals("-c")) {
            add(file, productName, price, quantity);
        }
    }

    static void add(File file, String productName, String price, String quantity) {
        try {
            int id = 0;
            Scanner fileNameScanner = new Scanner(file);
            while (fileNameScanner.hasNextLine()) {
                int curID = Integer.parseInt(fileNameScanner.nextLine().substring(0, 8).trim());
                if  (curID > id){
                    id = curID;
                }
            }
            fileNameScanner.close();
            PrintWriter printWriter = new PrintWriter(new FileOutputStream(file, true));
            printWriter.printf(Locale.US,"%n%-8d%-30s%-8s%s", id + 1, productName, price, quantity);
            printWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
}
AlexSir
Проверил, вывод в файл такой же, как и у меня. Попытался сбросить прогресс в задаче, плагин обновил каталог и не дает проверить твое решение — говорит что задача решена :). Ладно теперь давай шаманить. Посмотрел отличия своего, принятого кода и твоего.
1. Scanner scanner = new Scanner(System.in); — я использовал BufferedReader (думаю это не важно), но закрывал последней строкой в main.
2. при записи в файл, я не использовал локализацию «Locale.US»
3. для чтения BufferedReader fReader = new BufferedReader(new FileReader(fileName)); и для записи FileOutputStream out = new FileOutputStream(fileName, true);, т.е. не использовал File file = new File(fileName);

ЗЫ: С Закрытием потока, нарывался очень часто, что принимало только когда закрывал System.in в конце
Archie369
АЛИЛУЙА!

мой код:
--начало стандартное--
BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
            writer.write(String.valueOf(nextId) + String.format("%-30s",args[1]) + String.format("%-8s",args[2]) + String.format("%-4s",args[3]));
            writer.close();
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.