com.javarush.test.level17.lesson10.bonus01

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

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

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

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


/* 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
-c  - добавляет человека с заданными параметрами в конец 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)
    {
        //start here - начни тут
        SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy",Locale.ENGLISH);

        if (args[0].equals("-c"))
        {
            try{
                create(args[1],args[2],sdf.parse(args[3]));
            }
            catch (Exception e)
            {
                System.out.print("Ошибка парсинга даты.");
            }

        }
        if (args[0].equals("-u"))
        {
            try{
            update(Integer.parseInt(args[1]), args[2], args[3], sdf.parse(args[4]));
            }
            catch (Exception e)
            {
                System.out.print("Ошибка парсинга даты.");
            }
        }
        if (args[0].equals("-d"))
        {
            delete(Integer.parseInt(args[1]));
        }
        if (args[0].equals("-i"))
        {
            info(Integer.parseInt(args[1]));
        }
        /*Блок для просмотра результатов работы программы*/
        for (int i = 0; i < allPeople.size(); i++)
        {
                info(i);
        }
    }

    public static void create(String name, String sex, Date bd)
    {
        //System.out.println("Сreate "+name+" "+sex+" "+ date);
            if(sex.equals("м"))
            {
               Person person = Person.createMale(name, bd);
                allPeople.add(person);
                System.out.println(allPeople.indexOf(person));

            }
            if(sex.equals("ж"))
            {
                Person person = Person.createFemale(name, bd);
                allPeople.add(person);
                System.out.println(allPeople.indexOf(person));
            }
    }
    public static void update(int id, String name, String sex, Date bd)
    {
        try
        {
            Person person = allPeople.get(id);
            person.setName(name);
            if (sex.equals("м"))
            {
                person.setSex(Sex.MALE);
            }
            if (sex.equals("ж"))
            {
                person.setSex(Sex.FEMALE);
            }
            person.setBirthDay(bd);
            //System.out.println("Update "+name+" "+sex+" "+ date);
        }
        catch (IndexOutOfBoundsException e)
        {
            System.out.println("Попытка обновления информации для несуществующего id");
        }
    }
    public static void delete(int id)
    {
        //System.out.println("Delete "+id);
       try
       {
            Person person = allPeople.get(id);
            person.setName(null);
            person.setSex(null);
            person.setBirthDay(null);
        }
       catch (IndexOutOfBoundsException e)
       {
           System.out.println("Попытка удаления для несуществующего id");
       }
    }
    public static void info(int id)
    {
        //System.out.println("Info: "+id);
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
        try
        {
        Person person = allPeople.get(id);
        String sex;
        if(person.getSex()!=null)
        {
            if (person.getSex().equals(Sex.FEMALE))
            {
                sex = "ж";
                System.out.println(person.getName() + " " + sex + " " + sdf.format(person.getBirthDay()));
            } else if (person.getSex().equals(Sex.MALE))
            {
                sex = "м";
                System.out.println(person.getName() + " " + sex + " " + sdf.format(person.getBirthDay()));
            }
        }
        }
        catch (IndexOutOfBoundsException e)
        {
            System.out.println("Попытка просмотра профиля несуществующего id");
        }
    }
}



Person.java (ничего не менял)



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

import java.util.Date;

public class Person {
    private String name;
    private Sex sex;
    private Date birthDay;

    private Person(String name, Sex sex, Date birthDay) {
        this.name = name;
        this.sex = sex;
        this.birthDay = birthDay;
    }

    public static Person createMale(String name, Date birthDay){
        return new Person(name, Sex.MALE, birthDay);
    }

    public static Person createFemale(String name, Date birthDay){
        return new Person(name, Sex.FEMALE, birthDay);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Sex getSex() {
        return sex;
    }

    public void setSex(Sex sex) {
        this.sex = sex;
    }

    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }
}


Sex.java (Тоже не менял):

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

public enum Sex {
    MALE,
    FEMALE
}

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

mbllllb
Тестируй на
-c Петрова Мария ж 01/12/1992
-u 1 Петрова Мария ж 01/12/1992

Ну и ещё почитай на info.javarush старые темы по этой задаче — все возможные варианты ошибок там разжеваны подробно.
ezhvsalate
Внес изменения в код, позволяющие делать создание/обновление для имен из двух слов.

Ожидаемо не помогло, т.к. по заданию:

Программа запускается с одним из следующих наборов параметров:
-c name sex bd
-u id name sex bd
-d id
-i id

т.е. name — один параметр.

Темы старые читал-перечитывал, но все равно не могу понять в чем моя ошибка.

Ниже последняя версия кода с возможностью давать параметр name как «фамилия — имя».

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)
    {
        //start here - начни тут
        SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy",Locale.ENGLISH);

        if (args[0].equals("-c"))
        {
            try{
                if(args.length==4)
                {
                    create(args[1], args[2], sdf.parse(args[3]));
                }
                if(args.length==5)
                {
                    create(args[1]+ " " + args[2], args[3], sdf.parse(args[4]));
                }
            }
            catch (Exception e)
            {
                System.out.print("Ошибка парсинга даты.");
            }

        }
        if (args[0].equals("-u"))
        {
            try
            {
                if (args.length == 5)
                {
                    update(Integer.parseInt(args[1]), args[2], args[3], sdf.parse(args[4]));
                }
                if(args.length==6)
                {
                    update(Integer.parseInt(args[1]), args[2]+" " +args[3], args[4], sdf.parse(args[5]));
                }
            }

            catch (Exception e)
            {
                System.out.print("Ошибка парсинга даты.");
            }
        }
        if (args[0].equals("-d"))
        {
            delete(Integer.parseInt(args[1]));
        }
        if (args[0].equals("-i"))
        {
            info(Integer.parseInt(args[1]));
        }
        /*Блок для просмотра результатов работы программы*/
        for (int i = 0; i < allPeople.size(); i++)
        {
                info(i);
        }
    }

    public static void create(String name, String sex, Date bd)
    {
        //System.out.println("Сreate "+name+" "+sex+" "+ date);
            if(sex.equals("м"))
            {
               Person person = Person.createMale(name, bd);
                allPeople.add(person);
                System.out.println(allPeople.indexOf(person));

            }
            if(sex.equals("ж"))
            {
                Person person = Person.createFemale(name, bd);
                allPeople.add(person);
                System.out.println(allPeople.indexOf(person));
            }
    }
    public static void update(int id, String name, String sex, Date bd)
    {
        try
        {
            Person person = allPeople.get(id);
            person.setName(name);
            if (sex.equals("м"))
            {
                person.setSex(Sex.MALE);
            }
            if (sex.equals("ж"))
            {
                person.setSex(Sex.FEMALE);
            }
            person.setBirthDay(bd);
            //System.out.println("Update "+name+" "+sex+" "+ date);
        }
        catch (IndexOutOfBoundsException e)
        {
            System.out.println("Попытка обновления информации для несуществующего id");
        }
    }
    public static void delete(int id)
    {
        //System.out.println("Delete "+id);
       try
       {
            Person person = allPeople.get(id);
            person.setName(null);
            person.setSex(null);
            person.setBirthDay(null);
        }
       catch (IndexOutOfBoundsException e)
       {
           System.out.println("Попытка удаления для несуществующего id");
       }
    }
    public static void info(int id)
    {
        //System.out.println("Info: "+id);
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
        try
        {
        Person person = allPeople.get(id);
        String sex;
        if(person.getSex()!=null)
        {
            if (person.getSex().equals(Sex.FEMALE))
            {
                sex = "ж";
                System.out.println(person.getName() + " " + sex + " " + sdf.format(person.getBirthDay()));
            } else if (person.getSex().equals(Sex.MALE))
            {
                sex = "м";
                System.out.println(person.getName() + " " + sex + " " + sdf.format(person.getBirthDay()));
            }
        }
        }
        catch (IndexOutOfBoundsException e)
        {
            System.out.println("Попытка просмотра профиля несуществующего id");
        }
    }
}
laz_a_rus
Мой метод main:
public static void main(String[] args) throws ParseException {
    if (args.length > 0) {
        switch (args[0].toCharArray()[1]) {
            case 'c': create(args); break;
            case 'u': update(args); break;
            case 'd': delete(args); break;
            case 'i': info(args); break;
        }
    }
}
и create (для сравнения):
private static void create(String[] args) throws ParseException {
    switch (args[2].toCharArray()[0]) {
        case 'м' : allPeople.add(Person.createMale(args[1], FORMAT.parse(args[3]))); break;
        case 'ж' : allPeople.add(Person.createFemale(args[1], FORMAT.parse(args[3]))); break;
    }
    System.out.println(allPeople.size() - 1);
}
как видно, ошибки я везде пробрасывал (т.к. не сказано, что их обработать нужно), и обращался к параметрам прямо по индексам, без доп проверок.
А ошибка у вас, вероятнее всего, вот здесь
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy",Locale.ENGLISH);
Идем в доки и читаем.
m Minute in hour Number 30
а нам нужно
M Month in year Month July; Jul; 07
Вы вообще пробовали выводить ту дату которую парсили?
Ну и кусочек из info(args) напоследок:
System.out.println(person.getName() + " "
    + (person.getSex() == Sex.MALE ? "м" : "ж")
    + " " + format.format(person.getBirthDay()));
Ну и конечно же, мой код не претендует на роль образца (т.к. в нем тоже уйма «странностей», взять хотя бы args[0].toCharArray()[1] :) не знаю почему писал именно так, наверное захотелось просто) и приведен исключительно с целью демонстрации более компактной записи.
ezhvsalate
Огромное спасибо!
Тестирование прошло после того, как исправил мм на ММ в формате даты, и убрал лишние обработчики ошибок (как-то «передан несуществующий id»).
По поводу компактности кода замечание принимается, напротив старался как можно больше все упростить, пока искал ошибку.
mbllllb
Ожидаемо не помогло, т.к. по заданию:… т.е. name — один параметр.
А что Ваша логика скажет об инициализированной по умолчанию коллекции allPeople? Там же Иванов Иван и Петров Петр (т.е., Вам явно намекают, что Имя — понятие многозначное):D
Итак, тонкий хинт:
тестируй на: 1) Иванов Иван Иванович; 2) Жозе Эдуарду Тавареш да Силва; 3) Иван; (справедливости ради: читал, что у большинства принимало с учетом только ФИО, более длинные имена не рассматривали)
Толстый хинт:
В мейне не нужно проверять на количество аргументов — ты не знаешь длину имени (1, 2 или 3 слова). Да и вообще, когда я делал эту задачу, нужно было делать минимум проверок.
laz_a_rus
Вам тоже тончайший хинт: не делайте лишней работы и не советуйте другим ее делать. Если будет скучно — почитайте мои комментарии в этой теме, в частности вот этот. Там я неоднократно пытался донести «простую истину» — параметры с пробелами передаются в кавычках.
На этом тему
Жозе Эдуарду Тавареш да Силва
думаю, можно закрыть.
В мейне не нужно проверять на количество аргументов
это да, т.к. в задании четко сказано в каких случаях и с каким количеством параметров программа будет тестироваться.
ты не знаешь длину имени (1, 2 или 3 слова)
и не нужно, там может быть и десять слов, но это будет один параметр командной строки.
mbllllb
Спасибо большое, я не знал про кавычки (век живи, век учись). С меня плюс.
Впредь буду осмотрительнее.
YePS
  • YePS
  • 0
Не могу понять, что не так? Сервер отказывается проверять напрочь
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) throws Exception {
        DateFormat formatInput = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
        DateFormat formatOutput = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
        String key = args[0];

        if (key.equals("c")) {
            String name = args[1];
            char sex = args[2].charAt(0);
            Date bd = formatInput.parse(args[3]);

            if (sex=='м') {
                allPeople.add(Person.createMale(name,bd));
            }
            else if(sex=='ж') {
                allPeople.add(Person.createFemale(name,bd));
            }
        }
        else if (key.equals("u")) {
            int id = Integer.parseInt(args[1]);
            String name = args[2];
            char sex = args[3].charAt(0);
            Date bd = formatInput.parse(args[4]);

            if (sex=='м') {
                allPeople.add(id,Person.createMale(name,bd));
            }
            else if(sex=='ж') {
                allPeople.add(id,Person.createFemale(name,bd));
            }
            allPeople.remove(id+1);
        }
        else if (key.equals("d")) {
            int id = Integer.parseInt(args[1]);

            allPeople.remove(id);
        }
        else if (key.equals("i")) {
            int id = Integer.parseInt(args[1]);
            Person person = allPeople.get(id);

            String name = person.getName();
            String bd = formatOutput.format(person.getBirthDay());
            char sex = 'ж';


            if (person.getSex()==Sex.MALE) {
                sex = 'м';
            }

            System.out.println(name + " " + sex + " " + bd);

        }

        //start here - начни тут
    }




}
Kolobok
А если внимательно посмотреть что должно передаваться первым параметром и какой ты проверяешь?
Lexw
else if (key.equals("d")) {
            int id = Integer.parseInt(args[1]);

            allPeople.remove(id);


-d — производит логическое удаление человека с id

Это означает, что запись с id остаётся. Но все остальные значения равны null
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.