com.javarush.task.task18.task1827 бывшая level18.lesson10.bonus02. Не могу найти ошибку.

Господа, помогите найти ошибку в коде.
Вроде проверил все варианты, такие как пустые строки и подобное. Но валидатор новый все равно не принимает решение.


import java.io.*;

public class Solution {
    public static void main(String[] args) throws Exception {
        String operation = args[0];
        String productName = args[1];
        if (productName.length()>30) productName=productName.substring(0,30);
        String price = args[2];
        if (price.length()>8) price = price.substring(0,8);
        String quantity = args[3];
        if(quantity.length()>4) quantity = quantity.substring(0,4);
        if (operation.equals("-c")){
            add(productName, price, quantity);
        }
    }

    private static void add(String productName, String price, String quantity) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = reader.readLine();
        reader.close();
        BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
        String line;
        int index = 0;
        while (( line = fileReader.readLine()) != null){
            if (!line.equals("")){
                int temp = Integer.valueOf(line.substring(0, 8).trim());
                if (index < temp) index = temp;
            }
        }
        fileReader.close();
        PrintWriter printWriter = new PrintWriter(new FileOutputStream(fileName, true));
        printWriter.printf("%-8.8s%-30.30s%-8.8s%-4.4s%n", index + 1, productName, price, quantity);
        printWriter.close();
    }
}

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.ArrayList;
    public class Solution {
    static String result = "";
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String file = reader.readLine();
        reader.close();
        if (args.length==0 || args.length<4) return;
        if (args[0].equals("-c")){
            String new_id = makeId(file);
            String new_product = makeProduct(args[1]);
            String new_price = makePrice(args[2]);
            String new_quantity = makeQuantity(args[3]);
            result = new_id + new_product + new_price + new_quantity;
            FileWriter writer = new FileWriter(file,true);
            writer.write("\r\n" + result);
            writer.close();
        }
    }
    public static String makeId(String file)throws IOException{
        ArrayList<Integer> list = new ArrayList<Integer>();
        FileReader fr = new FileReader(file);
        BufferedReader reader = new BufferedReader(fr);
        String line = reader.readLine();
        while (line != null) {
            line = line.substring(0,8).trim();
            list.add(Integer.parseInt(line));
            line = reader.readLine();
        }
        int max = Integer.MIN_VALUE;
        for (Integer i:list)
            if (i>max)
                max = i;
        max++;
        String max_id = Integer.toString(max);
        if (max_id.length()>8)
            max_id = max_id.substring(0,8);
        if (max_id.length()<8)
            for (int i = max_id.length(); i < 8; i++)
                max_id = max_id + " ";
        fr.close();
        reader.close();
        return max_id;
    }
    public static String makeProduct(String product){
        String str = product;
        if (str.length()>30)
            str = str.substring(0,30);
        if (str.length()<30)
            for (int i = str.length(); i < 30; i++)
                str = str + " ";
        return str;
    }
    public static String makePrice(String price){
        String str = price;
        if (str.length()>8)
            str = str.substring(0,8);
        if (str.length()<8)
            for (int i = str.length(); i < 4; i++)
                str = str + " ";
        return str;
    }
    public static String makeQuantity(String quantity){
        String str = quantity;
        if (str.length()>4)
            str = str.substring(0,4);
        if (str.length()<4)
            for (int i = str.length(); i < 4; i++)
                str = str + " ";
        return str;
    }
 }

level18.lesson10.bonus02 и level18.lesson10.bonus03 (Бредовый результат - принят валидатором) + ошибка сервера.

Для выполнения этих двух задач полезно почитать 16-ю главу Философия Джава, минимум до Writer и Reader.
Также можно почитать теорию 19-го уровня.
bouns02

Вот такой результат был принят. Печалька.
Сделал задачу со второго раза, переписав код с нуля.
1. Читал символы через FileReader в StringBuilder.
2. Из StringBuilder прочитать строки. Пример есть в лекциях.
3. Найти максимальный ID — творчество.
4. Обработать входные данные — творчество.
5. Дописать увеличенный ID и данные в конец файла. Я делал через FileWriter. При чем дописано без перевода на следующую строку.

Без блоков try-catch. Всё в теле main.

Ошибка сервера в моём случае — лишние файлы в папке.
bonus03 с параметрами -u 1984798 Шорты пляжные red 159.00 12

исходные данные


ну это же ни в какие ворота. и bonus03 с первого раза прошел… Печаль, печаль, печаль.

bonus02
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
Данные дополнены пробелами до их длины
String result = String.format("%n%-8d%-30.30s%-8.2f%-4d",id, strToAppend, Float.valueOf(args[args.length-2]), Integer.valueOf(args[args.length-1]));
Пример:
19846   Шорты пляжные синие           159.00  12
198478  Шорты пляжные черные с рисунко173.00  17
19847983Куртка для сноубордистов, разм10173.991234
*/

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = reader.readLine();
        reader.close();
        InputStreamReader fileReader = new FileReader(fileName);
        StringBuilder stringBuilder = new StringBuilder();
        int count;
        while ((count = fileReader.read()) > -1)
        {
            stringBuilder.append((char) count);
        }
        fileReader.close();

        System.setIn(new ByteArrayInputStream(stringBuilder.toString().getBytes()));
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader bufferedReader = new BufferedReader(isr);
        ArrayList<Integer> stringArrayList = new ArrayList<>();
        while (true)
        {
            String line = bufferedReader.readLine();
            if (line == null) break;
            else if (!line.isEmpty()) {
                stringArrayList.add(Integer.parseInt(line.substring(0,8).trim()));
            }
        }
        Collections.sort(stringArrayList);
        bufferedReader.close();
        isr.close();

        Integer maxIDplusOne = stringArrayList.get(stringArrayList.size() - 1)+1;
        if (maxIDplusOne.toString().length()<8) {
            stringBuilder.append(maxIDplusOne);
            for (int i = maxIDplusOne.toString().length(); i < 8; i++)
            {
                stringBuilder.append(" ");
            }
        } else stringBuilder.append(maxIDplusOne);
        String arguments = "";
        if (args[0].equals("-c")) {

            for (int i = 1; i < args.length-2; i++)
            {
                arguments += args[i] + " ";

            }
            if (arguments.length()>30)
            {
                arguments = arguments.substring(0,30);
            }
            else if (arguments.length() < 30)
            {
                for (int i = arguments.length(); i < 30; i++)
                arguments += " ";
            }
            if (args[args.length-2].length()<8)
            {
                arguments += args[args.length-2];
                for (int i = args[args.length-2].length(); i < 8; i++)
                    arguments += " ";
            } else arguments += args[args.length-2];
            if (args[args.length-1].length()<4)
            {
                arguments += args[args.length-1];
                for (int i = args[args.length-1].length(); i < 4; i++)
                    arguments += " ";
            } else arguments += args[args.length-1];
        }
        FileWriter fileWriter = new FileWriter(fileName);
        fileWriter.write(stringBuilder.append(new StringBuilder(arguments).toString()).toString());
        fileWriter.close();
    }
}


bonus03
package com.javarush.test.level18.lesson10.bonus03;

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

В файле данные хранятся в следующей последовательности (без разделяющих пробелов):
id productName price quantity
Данные дополнены пробелами до их длины
String result = String.format("%n%-8d%-30.30s%-8.2f%-4d",id, strToAppend, Float.valueOf(args[args.length-2]), Integer.valueOf(args[args.length-1]));

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

import java.io.*;

public class Solution {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String fileName = reader.readLine();
            reader.close();
            InputStreamReader fileReader = new FileReader(fileName);
            StringBuilder stringBuilder = new StringBuilder();
            int count;
            while ((count = fileReader.read()) > -1) {
                stringBuilder.append((char) count);
            }
            fileReader.close();

            switch (args[0]) {
                case "-u": {
                    String arguments = "";
                    for (int i = 2; i < args.length-2; i++)
                    {
                        arguments += args[i] + " ";
                    }
                    String result = String.format("%n%-8.8s%-30.30s%-8.8s%-4.4s",args[1], arguments, args[args.length-2], args[args.length-1]);
                    Integer id = Integer.parseInt(args[1]);
                    FileWriter fileWriter = new FileWriter(fileName);
                    fileWriter.write(update(stringBuilder, id, result).toString());
                    fileWriter.close();
                }
                    break;
                case "-d": {
                    Integer id = Integer.parseInt(args[1]);
                    FileWriter fileWriter = new FileWriter(fileName);
                    fileWriter.write(delete(stringBuilder, id).toString());
                    fileWriter.close();
                }
                    break;
                default:
                    throw new Exception("wrong argument");
            }
        } catch (Exception e) {e.printStackTrace();}
    }
    private static StringBuilder delete(StringBuilder stringBuilder, Integer id) throws Exception{
        System.setIn(new ByteArrayInputStream(stringBuilder.toString().getBytes()));
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader bufferedReader = new BufferedReader(isr);
        StringBuilder stringBuilderTemp = new StringBuilder();
        while (true) {
            String line = bufferedReader.readLine();
            if (line == null) break;
            else if (!line.isEmpty()) {
                Integer idx = Integer.parseInt(line.substring(0, 8).trim());
                if (!id.equals(idx)) stringBuilderTemp.append(line).append("\n");
            }
        }
        bufferedReader.close();
        isr.close();
        return stringBuilderTemp;
    }
    private static StringBuilder update(StringBuilder stringBuilder, Integer id, String result) throws Exception{
        System.setIn(new ByteArrayInputStream(stringBuilder.toString().getBytes()));
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader bufferedReader = new BufferedReader(isr);
        StringBuilder stringBuilderTemp = new StringBuilder();
        while (true) {
            String line = bufferedReader.readLine();
            if (line == null) break;
            else if (!line.isEmpty()) {
                Integer idx = Integer.parseInt(line.substring(0, 8).trim());
                if (!id.equals(idx)) stringBuilderTemp.append(line).append("\n");
                else stringBuilderTemp.append(result).append("\n");
            }
        }
        bufferedReader.close();
        isr.close();
        return stringBuilderTemp;
    }
}
  • ,

level18.lesson10.bonus02 Не принимают задачу

Здравствуйте, коллеги!
Почему сервер не принимает код?! Обращаюсь к вам ввиду полной безысходности =) Помогите, пожалуйста!

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.ArrayList;
import java.util.Arrays;

public class Solution {
    public static void main(String[] args) throws Exception {
        String fileName = getFileName();
        switch (args[0]) {
            case "-c":
                writeData(fileName, args);
                break;
        }
    }
    
    /**
     * Get bases file name
     * @return bases file name
     * @throws IOException
     */
    static String getFileName() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String filename = reader.readLine();
        reader.close();

        return filename;
    }
    
    /**
     * Write to file
     * @param baseName bases file name
     * @param args row params
     * @throws IOException
     */
    static void writeData(String baseName, String[] args) throws IOException {
        RandomAccessFile base = new RandomAccessFile(baseName, "rw");

        int id = constructRowId(base);
        byte[] buffer = constructBuffer(id, args);

        base.seek(base.length());
        base.write(buffer, 0, buffer.length);

        base.close();
    }
    
    /**
     * Construct row id
     * @param base base file
     * @return row id
     */
    static int constructRowId(RandomAccessFile base) throws IOException{
        int result = 0;
        int id;
        byte[] buffer = new byte[8];

        for (long i = base.length()-80; i > 0; i = i-80) {
            base.seek(i);
            base.read(buffer);
            id = Integer.valueOf((new String(buffer)).trim());
            if (id > result) result = id;
        }
        return ++result;
    }
    
    /**
     * Construct buffer from params
     * @param id id row
     * @param params row params
     */
    static byte[] constructBuffer(int id, String[] params) {
        ArrayList<Byte> listBuffer = new ArrayList<Byte>();

        constructByteList(listBuffer, String.valueOf(id), 8);
        constructByteList(listBuffer, params[1], 60);
        constructByteList(listBuffer, params[2], 8);
        constructByteList(listBuffer, params[3], 4);

        return getBufferFromList(listBuffer);
    }
    
    /**
     * Fill the container for buffer
     * @param listBuffer container for byte buffer
     * @param str String for buffer
     * @param length strings length
     */
    static void constructByteList(ArrayList<Byte> listBuffer, String str, int length) {
        byte[] newByte = Arrays.copyOf(str.getBytes(), length);
        for (byte b : newByte) {
            // Fill spaces
            if (b == 0) listBuffer.add((byte) 32);
            else listBuffer.add(b);
        }
    }
    
    /**
     * Get array from bytes list
     * @param list bytes list
     * @return bytes array
     */
    static byte[] getBufferFromList(ArrayList<Byte> list) {
        byte[] result = new byte[list.size()];

        for (int i = 0; i < list.size(); i++) result[i] = list.get(i);
        return result;
    }
}
  • ,

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.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = reader.readLine();
        BufferedReader file1 = new BufferedReader(new FileReader(fileName));
        String lastId = "";
        int max = 0;
        if (args[0].equals("-c"))
        {
            while (file1.ready())
            {
                String sFile = file1.readLine();
                int id = Integer.parseInt(sFile.substring(0, 8).trim());
                if (id > max) max = id;
            }

            if (max < 99999999)
                lastId = Integer.toString(max + 1);
            else lastId = Integer.toString(max);


            file1.close();

            FileWriter file2 = new FileWriter(fileName, true);


            if (lastId.length() <= 8)
                while (lastId.length() != 8)
                {
                    lastId += " ";
                }

            if (args[1].length() <= 30)
            {
                while (args[1].length() != 30)
                {
                    args[1] += " ";
                }
            } else args[1] = args[1].substring(0, 30);

            if (args[2].length() <= 8)
            {
                while (args[2].length() != 8)
                {
                    args[2] += " ";
                }
            } else args[2] = args[2].substring(0, 8);

            if (args[3].length() <= 4)
            {
                while (args[3].length() != 4)
                {
                    args[3] += " ";
                }
            } else args[3] = args[3].substring(0, 4);


            file2.write("\r\n" + lastId + args[1] + args[2] + args[3]);

            file2.close();
        }


    }
}
  • ,

level18.lesson10.bonus02 не могу понять, что не нравится валидатору

Ни разу не обращался за помощью, но тут уже реально не могу понять, что не нравится валидатору.
Решение прогонял несколько раз на файлах. всё, вроде, норм, а сервер принимать не хочет
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.*;

public class Solution {
    public static void main(String[] args) throws Exception {
        if (args[0].equals("-c")) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String filename = reader.readLine();
            reader.close();
            int max = 0;
            String s = "";
            BufferedReader stream = new BufferedReader(new FileReader(filename));
            // Ищем максимальный ИД
            while ((s = stream.readLine()) != null) {
                Integer i = Integer.parseInt(s.substring(0, 8).trim());
                if (i > max) max = i;
            }
            max++;
            // Формируем строрку для записи
            // Вносим ИД
            s = String.valueOf(max);
            for (int i = s.length(); i < 8; i++) s += ' ';

            // Добавляем Наименование товара
            for (int i = 1; i < args.length - 2; i++) s += args[i] + " ";
            if (s.length() > 38) s = s.substring(0, 38);    // Если длинное, обрезаем
            else if (s.length() < 38)                       // Если короткое, добавляем
                for (int i = s.length(); i < 38; i++) s += ' ';

            // Добавляем цену
            s += args[args.length - 2];
            if (s.length() > 46) s = s.substring(0, 46);
            else if (s.length() < 46)
                for (int i = s.length(); i < 46; i++) s += ' ';

            // Добавляем количество
            s += args[args.length - 1];
            if (s.length() > 50) s = s.substring(0, 50);
            else if (s.length() < 50)
                for (int i = s.length(); i < 50; i++) s += ' ';

            // Записываем в файл
            BufferedWriter writer = new BufferedWriter(new FileWriter(filename, true));
            writer.newLine();
            writer.write(s);
            stream.close();
            writer.close();
        }
    }
}
  • ,

level18.lesson10.bonus02

Надеюсь кому-то это поможет! Я очень долго не мог понять, что в конце концов не так!

Если вы используете для записи FileWriter writer=new FileWriter(fileName); то что бы он не перезаписывал содержимое файла добавьте в конструктор true: FileWriter writer=new FileWriter(fileName, true);

level18.lesson10.bonus02

Помогите разобраться, почему сервер не принимает задание


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.*;

public class Solution {
    public static void main(String[] args) throws Exception {
        Scanner cin = new Scanner(System.in);
        String fileName = cin.nextLine(); //"d:/hw/test.txt";
        ProductTable productTable = new ProductTable(fileName);

        switch (args[0]) {
            case "-c":
                if (args.length >=4) {
                    int quantity = Integer.parseInt(args[args.length-1]);
                    double price = Double.parseDouble(args[args.length - 2]);
                    StringBuilder productName = new StringBuilder(args[1]);
                    for (int i = 2; i < args.length-2; i++)
                    {
                        productName.append(" " + args[i]);
                    }
                    Product product = new Product(productName.toString(), price, quantity);
                    productTable.putProduct(product);
                    productTable.save();
                }
                break;
        }
        cin.close();
    }

    public static class Product {
        private static int nextID = 0;
        private int id;
        private String productName;
        private double price;
        private int quantity;

        public Product(String productName, double price, int quantity)
        {
            this.id = nextID++;
            this.productName = productName;
            this.price = price;
            this.quantity = quantity;
        }

        public Product(String textLine) {
            id = Integer.parseInt(textLine.substring(0, 8).trim());
            productName = textLine.substring(8, 38);
            price = Double.parseDouble(textLine.substring(38, 46).trim());
            quantity = Integer.parseInt(textLine.substring(46, 49).trim());
            if (id >= nextID) nextID = id + 1;
            if (nextID > 99999999) nextID = 99999999;
        }

        @Override
        public String toString()
        {
            return String.format(Locale.ENGLISH, "%-8d%-30.30s%-8.2f%-4d", id, productName, price, quantity);
        }

        public int getId()
        {
            return id;
        }
    }

    public static class ProductTable {
        private Map<Integer, Product> productMap = new TreeMap<>();
        private String fileName;

        public ProductTable(String fileName) throws IOException
        {
            this.fileName = fileName;
            BufferedReader reader = new BufferedReader(new FileReader(this.fileName));
            Product product;
            String line;

            while ((line=reader.readLine())!=null) {
                product = new Product(line);
                productMap.put(product.getId(), product);
            }

            reader.close();
        }

        public void putProduct(Product product) {
            productMap.put(product.getId(), product);
        }

        public void save() throws IOException{
            PrintWriter writer = new PrintWriter(new FileWriter(fileName));
            for (Product product: productMap.values()) {
                writer.println(product);
            }
            writer.close();
        }
    }
}

level18.lesson10.bonus02

Помогите разобраться, почему сервер не принимает задание. Программ работает согласно заданию.

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.*;

public class Solution {
    public static void main(String[] args) throws Exception {
        Scanner cin = new Scanner(System.in);
        String fileName = cin.nextLine(); //"d:/hw/test.txt";
        ProductTable productTable = new ProductTable(fileName);

        switch (args[0]) {
            case "-c":
                if (args.length >=4) {
                    int quantity = Integer.parseInt(args[args.length-1]);
                    double price = Double.parseDouble(args[args.length - 2]);
                    StringBuilder productName = new StringBuilder(args[1]);
                    for (int i = 2; i < args.length-2; i++)
                    {
                        productName.append(" " + args[i]);
                    }
                    Product product = new Product(productName.toString(), price, quantity);
                    productTable.putProduct(product);
                    productTable.save();
                }
                break;
        }
        cin.close();
    }

    public static class Product {
        private static int nextID = 0;
        private int id;
        private String productName;
        private double price;
        private int quantity;

        public Product(String productName, double price, int quantity)
        {
            this.id = nextID++;
            this.productName = productName;
            this.price = price;
            this.quantity = quantity;
        }

        public Product(String textLine) {
            id = Integer.parseInt(textLine.substring(0, 8).trim());
            productName = textLine.substring(8, 38);
            price = Double.parseDouble(textLine.substring(38, 46).trim());
            quantity = Integer.parseInt(textLine.substring(46, 49).trim());
            if (id >= nextID) nextID = id + 1;
            if (nextID > 99999999) nextID = 99999999;
        }

        @Override
        public String toString()
        {
            return String.format(Locale.ENGLISH, "%-8d%-30.30s%-8.2f%-4d", id, productName, price, quantity);
        }

        public int getId()
        {
            return id;
        }
    }

    public static class ProductTable {
        private Map<Integer, Product> productMap = new TreeMap<>();
        private String fileName;

        public ProductTable(String fileName) throws IOException
        {
            this.fileName = fileName;
            BufferedReader reader = new BufferedReader(new FileReader(this.fileName));
            Product product;
            String line;

            while ((line=reader.readLine())!=null) {
                product = new Product(line);
                productMap.put(product.getId(), product);
            }

            reader.close();
        }

        public void putProduct(Product product) {
            productMap.put(product.getId(), product);
        }

        public void save() throws IOException{
            PrintWriter writer = new PrintWriter(new FileWriter(fileName));
            for (Product product: productMap.values()) {
                writer.println(product);
            }
            writer.close();
        }
    }
}

level18.lesson10.bonus02

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

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

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

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Solution {
    static List<String> priceList = new ArrayList<String>();

    public static void main(String[] args) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader fileReader = null;
        try {
            String fileName = reader.readLine(), currentLine;
            fileReader = new BufferedReader(new FileReader(fileName));
            while ((currentLine = fileReader.readLine()) != null) {
                priceList.add(currentLine);
            }
            if (args[0].equals("-с")) {
                addToFile(fileName, createProductName(args), args[args.length - 2], args[args.length - 1]);
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            try {
                reader.close();
                if (fileReader != null) fileReader.close();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
    }

    public static void addToFile(String fileName, String productName, String price, String quantity)  {
        BufferedWriter fileWriter = null;
        try {
            fileWriter = new BufferedWriter(new FileWriter(fileName, true));
            fileWriter.write('\n' + getNewLastID() + setLenght(productName, 30) + setLenght(price, 8) + setLenght(quantity, 4));
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            try {
                if (fileWriter != null) fileWriter.close();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
    }

    public static String createProductName(String[] array) {
        String result = "";
        for (int i = 1; i < array.length - 2; i++) {
            result += array[i] + " ";
        }
        return result;
    }

    public static int getInt(String str) {
        try {
            while (str.charAt(0) == '') str = str.substring(1);
            return Integer.parseInt(str.trim());
        } catch (NumberFormatException e1) {
            System.out.println(str + " wrong ID!");
            e1.printStackTrace();
            return 0;
        }
    }
    public static String getNewLastID() {
        String result;
        int maxID = 0;
        for (int i = 0; i < priceList.size(); i++) {
            if (maxID < getInt(priceList.get(i).substring(0, 8))) maxID = getInt(priceList.get(i).substring(0, 8));
        }
        result = maxID + 1 + "";
        return setLenght(result, 8);
    }

    public static String setLenght(String str, int lenght) {
        StringBuilder builder = new StringBuilder(str);
        builder.setLength(lenght);
        for (int i = 0; i < builder.length(); i++) {
            if (builder.charAt(i) == '\u0000') builder.setCharAt(i, ' ');
        }
        return builder.toString();
    }
}
  • ,

level18.lesson10.bonus02

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

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

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


В тексте задания есть строка
productName — название товара, 30 chars (60 bytes)
Почему не проходит тестирование программа, которая записывает файл в кодировке, в которой все символы гарантированно имеют длину 2 байта (например в UTF-16), а после замены кодировки на UTF-8 программа зачлась? Хотя в UTF-8 латиница, пробел и знаки препинания кодируются одним байтом и productName в файле получается менее 60 байт.

level18.lesson10.bonus02

Здравствуйте.

Был бы благодарен за помощь.
Все условия выполняются.
Пустая строчка — не помеха, в таком случае id смотрит из предыдущей.
productName может состоять больше чем из одного слова.
Однако не принимает.

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

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

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

Мой main:

public static void main(String[] args) throws Exception
    {

        ArrayList<String> helpList = new ArrayList<String>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = reader.readLine();
        FileInputStream fileInputStream = new FileInputStream(fileName); // файл на вход
        BufferedReader reader2 = new BufferedReader(new InputStreamReader(fileInputStream));
        RandomAccessFile randomAccessFile = new RandomAccessFile(fileName, "rw"); // тот же файл используем на выход
        if (!("-c".equals(args[0]))) throw new Exception();
        else
        {
            String a = "";
            while (!((a = reader2.readLine()) == null))
            {
                helpList.add(a);
            } // здесь имеем лист, в который занесены все строчки из текущего файла
            String productName = "";
            String price = args[args.length - 2];
            String quantity = args[args.length - 1];
            for (int i = 1; i < args.length - 2; i++)
                productName = productName + args[i]; // получили productName
            //составляем строчку для записи
            String finalString = parseID(getId(helpList) + 1) + parseProductName(productName) + parsePrice(price) + parseQuantity(quantity);
            helpList.add(finalString); // имеем новый лист со всеми строчками файла
            for (int i = 0; i < helpList.size(); i++)
            {
                randomAccessFile.write((helpList.get(i)).getBytes()); // записываем построчно в файл
                randomAccessFile.write(13); // записываем "enter" в конце
            }
        }
    } 


Метод для получения ID:

public static int getId(ArrayList<String> list) // метод для вычленения последнего ID
    {
        if (list.size() == 0) return 0; // если лист со строками из файла пуст, то id = 0
        else
        {
            int a = -1;
            int i = 1;
            while (a == -1)
            {
                String line = list.get(list.size() - i); //берем последнюю строку в листе
                String[] data = line.split(" "); //разбиваем ее для того, чтоб получить первый элемент (id)
                try
                {
                    int m = Integer.parseInt(data[0]); // вынимаем id, если это возможно
                    a = m;
                }
                catch (NumberFormatException ex)
                {
                    i++; // если нет, то переходим к предыдущей строке
                }
                catch (ArrayIndexOutOfBoundsException ex)
                {
                    a = 0;
                }
            }
            return a;
        }
    }


Метод для парсинга ID (приведения его к нужному формату с помощью пробелов):

public static String parseID(int id) // парсинг ID
    {
        String idS = String.valueOf(id);
        String newID = "";
        if (idS.length() > 8) // если его длина > 8, посимвольно составляем из первых 8
        {
            for (int i = 0; i < 8; i++)
                newID = newID + idS.charAt(i);
        }
        else if (idS.length() == 8) newID = idS;
        else // если его длина < 8, то приравниваем, дополнительные промежутки заполняем пробелами
        {
            newID = idS;
            int m = 8 - idS.length();
            for (int i = 0; i < m; i++)
                newID = newID + " ";
        }
        return newID;


Парсинг productName:

public static String parseProductName(String product) // парсинг имени аналогично предыдущему
    {
        String newProductName = "";
        if (product.length() > 30)
        {
            for (int i = 0; i < 30; i++)
                newProductName = newProductName + product.charAt(i);
        }
        else if (product.length() == 30) newProductName = product;
        else
        {
            newProductName = product;
            int m = 30 - product.length();
            for (int i = 0; i < m; i++)
                newProductName = newProductName + " ";
        }
        return newProductName;
    }


Парсинг цены:

public static String parsePrice(String idS) // парсинг цены аналогично
    {
        String newID = "";
        if (idS.length() > 8)
        {
            for (int i = 0; i < 8; i++)
                newID = newID + idS.charAt(i);
        }
        else if (idS.length() == 8) newID = idS;
        else
        {
            newID = idS;
            int m = 8 - idS.length();
            for (int i = 0; i < m; i++)
                newID = newID + " ";
        }
        return newID;
    }


Парсинг количества:

public static String parseQuantity(String idS) // парсинг количества аналогичен, только приравниваем к трем, потому что с четырьмя и моим символом Enter в ascii (13) образовывался дополнительный пробел, не принимала программа
    {
        String newID = "";
        if (idS.length() > 3)
        {
            for (int i = 0; i < 3; i++)
                newID = newID + idS.charAt(i);
        }
        else if (idS.length() == 3) newID = idS;
        else
        {
            newID = idS;
            int m = 3 - idS.length();
            for (int i = 0; i < m; i++)
                newID = newID + " ";
        }
        return newID;
    }