level18.lesson10.bonus02

Не понятно, как инкрементировать ID.

Если нужно искать самый большой ID во всем файле и инкрементировать его, то что делать когда он будет 99999999? Судя по условию, расширять длину ID нельзя, что остаётся? Делать ли его 1? А если в начале такой ID уже был?

И даже если так, то когда я один раз перейду этот барьер, то код все равно будет находить максимальный ID из всего файла, который равен 99999999 и после этого каждый следующий ID будет 1. Так может быть нужно последний инкрементировать и все?

/* Прайсы
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
*/

com.javarush.test.level17.lesson10.bonus01

Уважаемые форумчане,

помогите, пожалуйста с задачкой.

Код отрабатывает с вариантами параметров:
-c Петрова ж 01/12/1992
-u 1 Петрова ж 01/12/1992
-d 1
-i 1

Вроде бы все требования условия тем самым выполняются. Очень хочу понять, в чем ошибка.
  • ,

com.javarush.test.level17.lesson10.bonus01 - работает, но не проходит тестированиие, что не так?


package com.javarush.test.level17.lesson10.bonus01;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/* CRUD
CrUD - Create, Update, Delete
Программа запускается с одним из следующих наборов параметров:
-c name sex bd
-u id name sex bd
-d id
-i id
Значения параметров:
name - имя, String
sex - пол, "м" или "ж", одна буква
bd - дата рождения в следующем формате 15/04/1990
-с  - добавляет человека с заданными параметрами в конец allPeople, выводит id (index) на экран
-u  - обновляет данные человека с данным id
-d  - производит логическое удаление человека с id
-i  - выводит на экран информацию о человеке с id: name sex (м/ж) bd (формат 15-Apr-1990)

id соответствует индексу в списке
Все люди должны храниться в allPeople
Используйте Locale.ENGLISH в качестве второго параметра для SimpleDateFormat

Пример параметров: -c Миронов м 15/04/1990
*/

public class Solution
{
    public static List<Person> allPeople = new ArrayList<Person>();

    static
    {
        allPeople.add(Person.createMale("Иванов Иван", new Date()));  //сегодня родился    id=0
        allPeople.add(Person.createMale("Петров Петр", new Date()));  //сегодня родился    id=1
    }

    public static void main(String[] args)
    {
        Person person = null;

        if (args[0].substring(0, 2).equals("-c"))
        {
            String string = "";
            for (int i = 0; i < args.length; i++)
            {
                string = string + " " + args[i];
            }
            string = string.substring(1, string.length());
            String[] arguments = string.split(" ");
            if (arguments[2].equals("м"))
            {
                person = Person.createMale(arguments[1], new Date(arguments[3]));
                allPeople.add(person);
                System.out.println(allPeople.size());
            }
            if (arguments[2].equals("ж"))
            {
                person = Person.createFemale(arguments[1], new Date(arguments[3]));
                allPeople.add(person);
                System.out.println(allPeople.size());
            }

        }


        if (args[0].substring(0, 2).equals("-u"))
        {
            String string = "";
            for (int i = 0; i < args.length; i++)
            {
                string = string + " " + args[i];
            }
            string = string.substring(1, string.length());
            String[] arguments = string.split(" ");

            int index = Integer.parseInt(arguments[1]);
            allPeople.get(index).setName(arguments[2]);
            if (arguments[3].equals("м"))
            {
                allPeople.get(index).setSex(Sex.MALE);
            }
            if (arguments[3].equals("ж"))
            {
                allPeople.get(index).setSex(Sex.FEMALE);
            }
            allPeople.get(index).setBirthDay(new Date(arguments[4]));


        }
        if (args[0].substring(0, 2).equals("-d"))
        {
            String string = "";
            for (int i = 0; i < args.length; i++)
            {
                string = string + " " + args[i];
            }
            string = string.substring(1, string.length());
            String[] arguments = string.split(" ");
            int index = Integer.parseInt(arguments[1]);
            allPeople.remove(index);
        }
        if (args[0].substring(0, 2).equals("-i"))
        {
            String string = "";
            for (int i = 0; i < args.length; i++)
            {
                string = string + " " + args[i];
            }
            string = string.substring(1, string.length());
            String[] arguments = string.split(" ");
            int index = Integer.parseInt(arguments[1]);
            String name = allPeople.get(index).getName();
            String sex = "";
            if (allPeople.get(index).getSex().equals(Sex.MALE)) sex = "м";
            if (allPeople.get(index).getSex().equals(Sex.FEMALE)) sex = "ж";
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
            String dataString = simpleDateFormat.format(allPeople.get(index).getBirthDay());
            System.out.println(name + " " + sex + " " + dataString);

        }
    }
}

level17.lesson10.bonus01 не проходит проверку. Помогите!

package com.javarush.test.level17.lesson10.bonus01;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/* CRUD
CrUD - Create, Update, Delete
Программа запускается с одним из следующих наборов параметров:
-c name sex bd
-u id name sex bd
-d id
-i id
Значения параметров:
name - имя, String
sex - пол, "м" или "ж", одна буква
bd - дата рождения в следующем формате 15/04/1990
-с  - добавляет человека с заданными параметрами в конец allPeople, выводит id (index) на экран
-u  - обновляет данные человека с данным id
-d  - производит логическое удаление человека с id
-i  - выводит на экран информацию о человеке с id: name sex (м/ж) bd (формат 15-Apr-1990)

id соответствует индексу в списке
Все люди должны храниться в allPeople
Используйте Locale.ENGLISH в качестве второго параметра для SimpleDateFormat

Пример параметров: -c Миронов м 15/04/1990
*/

public class Solution {
    public static List<Person> allPeople = new ArrayList<Person>();

    static {
        allPeople.add(Person.createMale("Иванов Иван", new Date()));  //сегодня родился    id=0
        allPeople.add(Person.createMale("Петров Петр", new Date()));  //сегодня родился    id=1
    }

    public static void main(String[] args) {
//        String[] args = {"-c", "Миронов Дмитрий Васильевич ", "м", "15/04/1990"};

        if (args.length < 2) {
            return;
        }

        String action = args[0];

        if (action.equals("-c")) {
            create(args);
        }

        if (action.equals("-u")) {
            update(args);
        }

        if (action.equals("-i")) {
            info(args);
        }

        if (action.equals("-d")) {
            delete(args);
        }

//        info(new String[]{"-i", "2"});
    }

    private static void update(String[] args) {
        try {
            int i = 2;
            int id = Integer.parseInt(args[1]);
            if (id >= allPeople.size()) throw new Exception();

            String name = "";
            for (; i < args.length - 2; i++) {
                name += args[i];
            }

            String bdS = args[args.length - 1];
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
            Date bd = sdf.parse(bdS);

            String sex = args[i];
            if (sex.equals("м"))
                allPeople.set(id, Person.createMale(name, bd));
            else if (sex.equals("ж"))
                allPeople.set(id, Person.createFemale(name, bd));
            else throw new Exception();

        }
        catch (Exception e) {

        }
    }

    private static void create(String[] args) {
        try {
            int i = 1;
            String name = "";

            for (; i < args.length - 2; i++) {
                 name += args[i];
            }

            String bdS = args[args.length - 1];
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
            Date bd = sdf.parse(bdS);

            String sex = args[i];
            if (sex.equals("м"))
                allPeople.add(Person.createMale(name, bd));
            else if (sex.equals("ж"))
                allPeople.add(Person.createFemale(name, bd));
            else throw new Exception();
        }
        catch (Exception e) {

        }
    }

    private static void info(String[] args) {
        try {
            int id = Integer.parseInt(args[1]);
            if (id < allPeople.size()) {
                String info = allPeople.get(id).getName() + " ";

                if (allPeople.get(id).getSex() == Sex.MALE) {
                    info += "м ";
                } else if (allPeople.get(id).getSex() == Sex.FEMALE) {
                    info += "ж ";
                } else if (allPeople.get(id).getSex() == null) {
                    info += null + " ";
                }

                if (allPeople.get(id).getBirthDay() == null) {
                    info += null + " ";
                } else {
                    SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
                    info += sdf.format(allPeople.get(id).getBirthDay());
                }
                System.out.println(info);
            } else
                throw new Exception();
        }
        catch (Exception e) {

        }
    }

    private static void delete(String[] args) {
        try {
            int id = Integer.parseInt(args[1]);
            if (id < allPeople.size()) {
                allPeople.get(id).setName(null);
                allPeople.get(id).setBirthDay(null);
                allPeople.get(id).setSex(null);
            } else
                throw new Exception();
        }
        catch (Exception e) {

        }
    }
}
  • ,

level17.lesson10.bonus01

/* CRUD
CrUD - Create, Update, Delete
Программа запускается с одним из следующих наборов параметров:
-c name sex bd
-u id name sex bd
-d id
-i id
Значения параметров:
name - имя, String
sex - пол, "м" или "ж", одна буква
bd - дата рождения в следующем формате 15/04/1990
-с  - добавляет человека с заданными параметрами в конец allPeople, выводит id (index) на экран
-u  - обновляет данные человека с данным id
-d  - производит логическое удаление человека с id
-i  - выводит на экран информацию о человеке с id: name sex (м/ж) bd (формат 15-Apr-1990)

id соответствует индексу в списке
Все люди должны храниться в allPeople
Используйте Locale.ENGLISH в качестве второго параметра для SimpleDateFormat

Пример параметров: -c Миронов м 15/04/1990
*/




Третий день не могу понять, в чём проблема. То ли лыжи не едут, то ли я долбанутый.
в -c id выводится
в -u апдейт действительно апдейт, а не создание нового вместо старого
в -d удаление логическое, если я правильно всё понял, конечно.
Возможность нескольких слов в имени учтена.

Что я упустил?

upd: Решено.
  • ,

level18.lesson10.bonus03

Господа полуночники. Где я не прав?)) Программа работает согласно условию. Самые дотошные проверки не делал (а-ля если id больше 8 символов или если price содержит букву или запятую вместо точки), так как предыдущая, похожая задача прошла без них. Где я не прав?))

/* Прайсы 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
Данные дополнены пробелами до их длины

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

import java.io.*;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = reader.readLine();
        reader.close();
        List<String> list = new ArrayList<String>();

        if (args[0].equals("-u")) {
            if (args.length < 5) throw new RuntimeException();

            //Формируем строку productName
            String productName = "";
            try {
                for (int i = 2; i < args.length - 2; i++) {
                    productName += args[i] + " ";
                }
            //Формируем строки id, price и quantity
                String price = args[args.length - 2];
                String quantity = args[args.length - 1];
                String id = args[1];
                
                // Создаем новую строку, которую поместим в файл вместо старой
                Formatter formatter = new Formatter();
                formatter.format("%-8.8s%-30.30s%-8.8s%-4.4s", id, productName, price, quantity);
                String update = formatter.toString();

                //читаем строки из файла и добавляем в массив
                //проверяем содержит ли строка id, и если да,
                //то добавляем в массив новую строку вместо старой
                Scanner scanner = new Scanner(new File(fileName), "cp1251");
                while (scanner.hasNext()) {
                    String line = scanner.nextLine();
                    String idLine = line.substring(0, 8);
                    if (idLine.contains(id)) {
                        list.add(update + "\r\n");
                    }
                    if (!idLine.contains(id)) {
                        list.add(line + "\r\n");
                    }
                }
                scanner.close();

                //записываем обновленные данные в файл из массива
                RandomAccessFile fileUpdate = new RandomAccessFile(fileName, "rw");
                for (int i = 0; i < list.size(); i++) {
                    fileUpdate.write(list.get(i).getBytes("cp1251"));
                }
                fileUpdate.close();
            } catch (Exception e) {

            }
        }

        if (args[0].equals("-d")) {
            if (args.length != 2) throw new RuntimeException();

            try {
                String id = args[1];

                //читаем строки из файла в массив
                //если строка НЕ содержит id, добавляем ее в массив
                Scanner scanner = new Scanner(new File(fileName), "cp1251");
                while (scanner.hasNext()) {
                    String line = scanner.nextLine();
                    String idLine = line.substring(0, 8);
                    if (!idLine.contains(id)) {
                        list.add(line + "\r\n");
                    }
                }
                scanner.close();

                //записываем данные в файл из массива (без строки, которую нужно было удалить)
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "cp1251"));
                for (int i = 0; i < list.size(); i++) {
                    bufferedWriter.append(list.get(i));
                }
                bufferedWriter.close();

            } catch (Exception e) {

            }
        }
        else {
            return;
        }
    }
}