• ,

level19.lesson10.home03

Помогите разобраться. Не проходит проверку. При указанном входном файле содержимое листа PEOPLE (способ вывода закомментарен внизу кода):
Иванов Иван Иванович Thu Dec 31 12:35:22 EET 1987
Вася Wed May 15 12:35:22 EEST 2013
Что вроде бы как правильно.


/* Хуан Хуанович
В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя день месяц год
где [имя] - может состоять из нескольких слов, разделенных пробелами, и имеет тип String
[день] - int, [месяц] - int, [год] - int
данные разделены пробелами

Заполнить список PEOPLE импользуя данные из файла
Закрыть потоки

Пример входного файла:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
*/

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

hubert
1. Кто будет твои ексепшены перехватывать?
2. на выходе у тебя получился пустой список (тестовый файл).
hubert
А скодировкой не пробовал поэкспериментировать?
pupvas4
Да, действительно, UTF-8. Не очевидно, как по-моему. Можно ли так понимать, что во всем курсе везде, где идет работа с текстом, используется UTF-8?
hubert
Скажу тебе больше — на работе ты будешь зачастую иметь дело именно с этой кодировкой.
alexnjc
В первом примере используются регеспы в паттерне, где про них можно почитать?
Alexandr_Vasechkin
Засчитало у кого-нить задачу или она с багом? У меня тоже не принимает
AlRays
Задача рабочая
Domkq
Почему может не принимать, кто знает? Условия все выполнены — поток закрыт, список заполнен (и вроде бы так, как надо):

package com.javarush.test.level19.lesson10.home03;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/* Хуан Хуанович
В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя день месяц год
где [имя] - может состоять из нескольких слов, разделенных пробелами, и имеет тип String
[день] - int, [месяц] - int, [год] - int
данные разделены пробелами

Заполнить список PEOPLE импользуя данные из файла
Закрыть потоки

Пример входного файла:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
*/

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

    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new FileReader(args[0]));
//        BufferedReader reader = new BufferedReader(new FileReader("E:\\1\\1.txt"));

        Date date = null;
        while (reader.ready())
        {
            String str = reader.readLine();
            String[] array = str.split(" ");
            String name = "";
            // имя
            for (int i = 0; i < array.length - 3; i++)
                name = name + array[i] + " ";

            SimpleDateFormat sdf = new SimpleDateFormat("dd MM yyyy");
            // дата рождения
            String data = (Integer.parseInt(array[array.length - 3]) + " " + Integer.parseInt(array[array.length - 2]) + " " + Integer.parseInt(array[array.length - 1]));
            // перекодируем  в UTF-8 
            byte[] utf8Bytes = name.getBytes("UTF-8");
            String nameInUTF = new String(utf8Bytes, "UTF-8");
            // парсим дату
            try
            {
                date = (sdf.parse(data));
            }
            catch (ParseException e)
            {
                e.printStackTrace();
            }
            PEOPLE.add(new Person(nameInUTF, date));
        }
        reader.close();
//           for (int i = 0 ; i < PEOPLE.size(); i++)
//               System.out.println(PEOPLE.get(i).getName() + " " + PEOPLE.get(i).getBirthday());
    }

}
tempys
  • tempys
  • 0
  • Комментарий отредактирован 2014-02-03 22:11:44 пользователем tempys
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

/* Хуан Хуанович
В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя день месяц год
где [имя] - может состоять из нескольких слов, разделенных пробелами, и имеет тип String
[день] - int, [месяц] - int, [год] - int
данные разделены пробелами

Заполнить список PEOPLE импользуя данные из файла
Закрыть потоки

Пример входного файла:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
*/

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

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

        String line = "";
        BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(args[0])));
        while((line = r.readLine())!= null)
        {
            String[] array = line.split(" ");
            String name = "";
            for(int i =0;i<array.length;i++){
               // System.out.println(array[i]);
                try {
                    int date = Integer.parseInt(array[i]);
                    int year = Integer.parseInt(array[i+2]);
                    int month = Integer.parseInt(array[i+1]);
                    Calendar birthdayCalendar = new GregorianCalendar(date,month-1,year);
                    System.out.println(name+" "+birthdayCalendar.getTime()+"      "+ date+" "+month+" "+year+" "+array[i]);
                    PEOPLE.add(new Person(name,birthdayCalendar.getTime()));
                    break;


                } catch (Exception e){ name = name +" "+array[i];}
            }
        }
        r.close();
    }

}

Почему не работает выходные данные нормальные ж…
tsev
Вот что ваша программа выдает на данных из примера:
Person{name=' Иванов Иван Иванович', birthday=Thu May 09 00:00:00 GMT+04:00 37}
Person{name=' Вася', birthday=Sat Nov 02 00:00:00 GMT+04:00 20}
tempys
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

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

        String line = "";
        BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(args[0])));
        Calendar birthdayCalendar = new GregorianCalendar();
        while((line = r.readLine())!= null)
        {
            String[] array = line.split(" ");
            String name = "";
            for(int i =0;i<array.length;i++){
               // System.out.println(array[i]);
                try {
                    int date = Integer.parseInt(array[i]);
                    int year = Integer.parseInt(array[i+2]);
                    int month = Integer.parseInt(array[i+1]);
                     birthdayCalendar.set(year,month-1,date);
                  //  System.out.println(name+" "+birthdayCalendar.getTime()+"      "+ date+" "+month+" "+year+" ");
                    break;
                } catch (Exception e){ name = name +" "+array[i];}

                PEOPLE.add(new Person(name,birthdayCalendar.getTime()));
            }
        }
        r.close();
    }

}


исправил дату тепер выводит коректно, все равно не принимает
tsev
А с именем разве всё в порядке?
tempys
капец, просто 2 часа потратил тупо на ерунду.
Код то полностью рабочий давно так не тупил…
deft
Огромное спасибо за комментарий. И спустя 2 года он актуален как никак=)))
Olga-Shavkunova
У меня также был пробел в имени, целые сутки, не могла понять в чем дело, пока внимательно не прочитала ваш комментарий. При выводе на экран без кавычек этого заметить практически не возможно.
tempys
в чем здесь проблема?
Alexandr
Почему не проходит тестирование, на что нужно обратить внимание?
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) throws IOException
    {
        BufferedReader fileReader = new BufferedReader(new InputStreamReader(new FileInputStream(args[0])));

        while (fileReader.ready()){
            Date date = new Date();
            String name = "";
             String[]str = fileReader.readLine().split(" ");
             for(int i=0;i<str.length;i++){
                    try{
                         date = new SimpleDateFormat("dd MM yyyy").parse(str[i] + " " + str[i+1] + " " + str[i+2]);
                         break;
                    }
                    catch (ParseException e){name += str[i] + " ";}
             }
             PEOPLE.add(new Person(name, date));
        }
        fileReader.close();

       /* for(Person p : PEOPLE){
            System.out.println(p.getName() + p.getBirthday());
        } */
    }
}
theGrass
как верно заметил tsev пробел имеет значение)
Alexandr
Вот вывод:

Иванов Иван Иванович Thu Dec 31 00:00:00 EET 1987
Вася Wed May 15 00:00:00 EEST 2013

Вроде, никаких лишних пробелов нет :(
theGrass
И все таки он там есть :) ты же его сам и сохраняешь)
Alexandr
С таким выводом не принимает

ИвановИванИвановичThu Dec 31 00:00:00 EET 1987
ВасяWed May 15 00:00:00 EEST 2013

… и с таким тоже нет…

ИвановИванИванович Thu Dec 31 00:00:00 EET 1987
Вася Wed May 15 00:00:00 EEST 2013

А каким должен быть вывод?
Nikaaner
  • Nikaaner
  • 0
  • Комментарий отредактирован 2014-05-07 00:18:15 пользователем Nikaaner
theGrass права. Перед тем как добавлять в список отсечи последний пробел в строке name, и тогда примет.
Вывод должен быть такой:
Иванов Иван Иванович Thu Dec 31 00:00:00 EET 1987
Вася Wed May 15 00:00:00 EEST 2013
AlkAlkovich
Спасибо вам)
Grosha
Дякую за пояснення!!! Ніяк не міг зрозуміти про який саме йдеться пробіл.
Nikaaner
Будь ласка ;)
bazizdeg
И как это сделать? Как отсечь последний пробел?
olegshan
  • olegshan
  • 0
  • Комментарий отредактирован 2015-11-27 22:21:35 пользователем olegshan
nameLine = nameLine.substring(0, nameLine.lastIndexOf(" "));
Dimich
Спасибо, тоже не принимало из-за пробела )
Отсекал так:
name = name.trim();
cracker
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) throws FileNotFoundException, ParseException
    {
        Scanner scanner = new Scanner(new File(args[0]), "UTF-8");
        String str;

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MM yyyy");
        Date date;
        String name;
        String stringDate;
        while (scanner.hasNext()){
            str = scanner.nextLine();

            name = str.replaceAll("\\p{Digit}", "");
            stringDate = str.replaceAll("\\p{L}", "");
            name = name.trim();
            stringDate = stringDate.trim();
            date = simpleDateFormat.parse(stringDate);
            PEOPLE.add(new Person(name, date));

        }
        scanner.close();

    }

}
работает но почему то не принимает. Что не так??
cracker
HELP HELP!!!
cracker
так что никто не поможет???
tsev
1. Ваша программа на тестовых данных:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
совсем ничего не добавляет в PERSON;

2. Кодировку не стоит добавлять, если в задании об этом явно не сказано;

3. На собственном опыте убедился что валидатор не очень любит Scanner, решаю все задачи через Buffered/Input Reader'ы, если в задании четко не сказано использовать Scanner. Попробуйте считать файл с их помощью.
Alexandr
1. В какой PERSON??? В PEOPLE что ли?! А это разве не добавление:
PEOPLE.add(new Person(name, date));

Вывод у него такой:

Иванов Иван ИвановичThu Dec 31 00:00:00 EET 1987
ВасяWed May 15 00:00:00 EEST 2013

Всё добавляется! Там что то другое…
cracker
Да все добавляется, опять я должен включить экстросенсорику
2 как кодировка может влиять на решение задачи??
3 в задании явно не сказано чем читать следовательно делаю как хочу
И последнее так что не так???
MSBlast
Кодировка очень сильно можно влиять на приём задачи. К сожалению простор для творчества при автоматическом тестировании ограничен. Кодировка должна быть либо UTF-8, либо никакой. В моём варианте решено через Scanner с явным указанием кодировки. Ты тестил свой код на пустом или неполном args?
hubert
  • hubert
  • 0
  • Комментарий отредактирован 2014-04-16 18:11:54 пользователем hubert
Не нужно ничего включать. Нужно просто правильно решить задачу.
Один написал что-то, а ты начал это подробно комментировать, хотя ничего из этого к делу не относится.
1. Плохо читает у тебя из файла — из 4 тестовых записей твой код смог осилить только 2. Кодировка тут ни при чем вообще. Так что вы сами тут себе придумали причину, и обсуждаете ее.
3. Читай чем хочешь, кто мешает?
И последнее — напиши свое решение не для 2 примеров, что даны в шаблоне, а нормальное решение для всех возможных случаев. Варианты придумай сам (какие данные могут оказаться в файле) — не так много вариантов.
cracker
дайте свои тестовые строки, а то я не могу понять о чем речь, я проверяю все работает вроде.
hubert
Самое главное — даже написав правильное решение, у тебя все равно не пройдет т.к. ты поменял метод мейн
cracker
опять я не понял можно меня носом тыкнуть
cracker
и если даже поменял(хотя я не понимаю что) главное что программа работает(тоже не понимаю при каких вариантах она не идет)
MSBlast
На содержимом вот такого файла твой код отваливается и не выводит вообще ничего.

Иванов Иван Иванович 31 12 1987
Вася 15 5 2013

Коля 12 4 2012
cracker
читай условие
В этом файле каждая строка имеет следующий вид:
имя день месяц год
!!! КАЖДАЯ СТРОКА!!!
MSBlast
Ну окей, тогда почему строка Vasya Petya Genya Gena 33 153 08, с твоим кодом попадает в список PEOPLE если она не подходит по условию? Ты улавливаешь суть?
cracker
вот именно она не подходит по условию в условии сказано что
!!!
В этом файле каждая строка имеет следующий вид:
имя день месяц год
!!! КАЖДАЯ СТРОКА!!!
cracker
имя день месяц год!!!
разве месяц может быть 153??? нет значит все гуд
MSBlast
Во-первых, убери капс и обилие восклицательных знаков. Помощь на форуме дело сугубо добровольное, соблюдай правила хорошего тона. Во-вторых, твоё решение должно не только работать с «правильным» файлом, а также отфильтровывать всё что не проходит по условию. То есть имя из 4 слов или если имени нет вообще, или если дата не парсится должным образом, или если аргументов нет вообще, а правильные строчки должны попадать в PEOPLE. Один из фундаментов ООП — абстракция. Перечитай если забыл.
cracker
я просто цитировал задание, а о том что ты сейчас говоришь в задании не сказано, если это так на самом деле как ты пишешь задача поставлена неправильно. Там конкретно написано что содержит файл и что из него выбирать. Про проверки ни слова. И где я не соблюдал правила хорошего тона??
cracker
и раз на то пошло а может слова разделены не пробелами(ошибки), а может там и имен и дат нету, а может еще что, задача непоймучегохочу да)??
MSBlast
  • MSBlast
  • +1
  • Комментарий отредактирован 2014-04-16 19:53:05 пользователем MSBlast
Условие задачи не всегда полное и достоверное, к 20 уровню ты уже должен был это заметить. Можно добавить элементарную проверку args.length которая должна быть больше 3 и меньше 7. Всё остальное не подходит, займёт 1 строчку и отсеешь кучу неверных данных. Main также не ловит эксепшн если args[0]=null, опять же 1 строчка. И вообще на будущее лучше всё это ловить в try-catch нежели пробрасывать в сигнатуре метода. Прежде чем обращаться за помощью, протестируй как следует и убедись что твой код ловит и обходит все возможные заковырки, как правило вопросы отпадают сами собой. В задачах связанных с чтением/записью файла, таких затычек будет очень много.
cracker
за помощь спасибо, но как я писал выше, а вдруг кто то ошибся и не поставил пробел между датой и именем и я решил этот момент учесть, а разработчики его не учли то задачу может и не принять, вот по этому надо задачу ставить четко. выходит эдакое гадание на кофейной гуще, что тут за подстава.
Alexandr
А этот момент оказался очень важным! Всем спасибо за подсказки, удалось решить! :)
Ruzveld
  • Ruzveld
  • 0
  • Комментарий отредактирован 2014-07-15 02:07:58 пользователем Ruzveld
MSBlast, А скажи плиз, почему не рекомендуется использовать throws в сигнатуре? Это относится только к main? У меня в 99% случаев проверка проходит независимо от того, как я обрабатываю исключения. В одном задании, правда, мне понадобилось убрать throws из main, чтобы задача была принята.
Naissur
Никогда не добавляйте в код элементы, которых нет в техническом задании (независимо от того, насколько вам хочется сделать это «на будущее») ©
Mishutka
Подскажите ошибку!
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

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

        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(args[0]), "utf-8"));
        List<Integer> list = new ArrayList<Integer>();

        while (reader.ready())
        {

            String k=reader.readLine();
                String []d = k.split(" ");
                String result="";
                for (int i = 0; i < d.length; i++)
                {
                    try
                    {
                        int n = Integer.parseInt(d[i]);
                        list.add(n);
                    }
                    catch (NumberFormatException e)
                    {
                        result = result + d[i] + " ";
                    }
                }

if (list.size()==3)
{
    Calendar b = new GregorianCalendar(list.get(2), +list.get(1) - 1, list.get(0));
    PEOPLE.add(new Person(result, b.getTime()));
    list.clear();
}

        }
        reader.close();

    }

}
Alexandr
1.Поменял сигнатуру метода main
2.Между именем и датой не должно быть пробела
Mishutka
Убрал пробел, сигнатуру не менял, всё гуд — засчиталась!
Mishutka
Я посмотрел комментарии я не совсем правильно и рационально решаю задачу, поичтал комментарии и написал по другому все равно не проходит.
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) throws IOException, ParseException
    {

        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(args[0])));

        SimpleDateFormat format = new SimpleDateFormat("dd MM yyyy");
        Date date;
        String name;
        String stringDate;
        String str;

        while (reader.ready())
        {
            str = reader.readLine();

            name = str.replaceAll("\\p{Digit}", "");
            stringDate = str.replaceAll("\\p{L}", "");
            name = name.trim();
            stringDate = stringDate.trim();
            date = format.parse(stringDate);
            PEOPLE.add(new Person(name, date));


        }
        reader.close();



    }

}
Nikaaner
  • Nikaaner
  • 0
  • Комментарий отредактирован 2014-05-07 00:29:01 пользователем Nikaaner
Я решил другим способом, поэтому не знаю, но подозреваю, что если каким-то образом в имени попадется цифра, то твое решение провалит этот тест.
GabbazovRuslan
подскажите пожалуйста что не так — вроде все комменты прочел все постарался учесть, а вот никак:(((
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) {
        if (args.length!=1) {
            System.out.println("неверный входной аргумент");
            return;
        }
        Scanner scanner = null;
        try {
            scanner = new Scanner(new FileReader(args[0]));
        }
        catch (Exception e) {
            System.out.println("адрес файла входного аргумента не верен");
            return;
        }
        String str, family;
        String[] array;
        while (scanner.hasNextLine()){
            str = scanner.nextLine();
            array = str.split(" ");

            if (array.length>3 & args.length<7) {
                family = array[0];
                if (array.length > 4) {
                    for (int i = 1; i < array.length - 3; i++) family += " " + array[i];
                }
                try {
                    int day = Integer.parseInt(array[array.length - 3]);
                    int mounth = Integer.parseInt(array[array.length - 2])-1;
                    int year = Integer.parseInt(array[array.length-1]);

                    Calendar date = new GregorianCalendar(day, mounth, year);
                    System.out.println(family + " " + date.getTime());

                    PEOPLE.add(new Person(family, date.getTime()));
                }
                catch (Exception e) {}
            }
        }
        scanner.close();
    }
}
GabbazovRuslan
Решил. Надо было SimpleDateFormat ввести:(
ttt
  • ttt
  • 0
Господа телепаты! Прошу помощи!
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args)  throws Exception{
        
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(args[0])));
        Calendar birthdayCalendar = new GregorianCalendar();
        while((s=reader.readLine())!=null){

            String ss1 = s.replaceAll("\\P{L}", " ").replaceAll("\\s+", " ");
            String ss2 = s.replaceAll("\\D"," ").replaceAll("\\s+"," ");
            String ss[]=ss2.split(" ");
            birthdayCalendar.set(Integer.parseInt(ss[3]),Integer.parseInt(ss[2])-1,Integer.parseInt(ss[1]));
            PEOPLE.add(new Person(ss1,birthdayCalendar.getTime()));

        }
        reader.close();
    }
}
d011ars
Для всех у кого все работает, но не принимает сервер — проверьте метод main он не должен бросать Exception'ы, добавле try..catch, у меня так было)
DesmondJava
лол, у самого была проблема с пробелом в имени, а всего не засчитывалось из-за name = name.trim(); :) мелочи творят чудеса))
nevazno
d011ars tsev MSBlast подскажите пожалуйста что не так — вроде все комменты прочел все постарался учесть, а вот никак.
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) {

        try{
            String line = "";
            BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(args[0])));
            //BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            //BufferedReader r = new BufferedReader(new FileReader(reader.readLine()));
            Calendar birthdayCalendar = new GregorianCalendar();
            while((line = r.readLine())!= null)
            {
                String[] array = line.split(" ");
                String name = "";
                if (array.length>3 & array.length<7)
                    for(int i =0;i<array.length;i++){

                        try {
                            int date = Integer.parseInt(array[i]);
                            int month = Integer.parseInt(array[i+1]);
                            int year = Integer.parseInt(array[i+2]);
                            birthdayCalendar.set(year,month-1,date);
                            //System.out.println(name+" "+ date+" "+month+" "+year+" ");

                            break;
                        } catch (Exception e){ name += array[i] + " " ;}

                        PEOPLE.add(new Person(name,birthdayCalendar.getTime()));
                    }
            }
            r.close();
        }
        catch (IOException e){
            System.out.println("Нет такого файла");
            return;
        }

    }

}
nevazno
тестил на:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013

Иванов Иван Иванович 31 12 1987

Вася Вася Вася Вася Вася Вася Вася Вася Вася Вася 15 5 2013

вывод:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
Иванов Иван Иванович 31 12 1987
nevazno
Что никто подсказать не может?
nevazno
hubert прошу Вашей помощи!
Docktor91
ладно попробуем тебе помочь,
коментарии убираешь когда отправляешь на тест?
с чего ты взял что имя должно быть короткое?
пока все
nevazno
убераю. вот такой код подаю а сервер не принемает:
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) {

        try{
            String line = "";
            BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(args[0])));

            Calendar birthdayCalendar = new GregorianCalendar();
            while((line = r.readLine())!= null)
            {
                String[] array = line.split(" ");
                String name = "";
                if (array.length>3 & array.length<7)
                    for(int i =0;i<array.length;i++){

                        try {
                            int date = Integer.parseInt(array[i]);
                            int month = Integer.parseInt(array[i+1]);
                            int year = Integer.parseInt(array[i+2]);
                            birthdayCalendar.set(year,month-1,date);


                            break;
                        } catch (Exception e){ name += array[i] + " " ;}

                        PEOPLE.add(new Person(name,birthdayCalendar.getTime()));
                    }
            }
            r.close();
        }
        catch (IOException e){
           
        }

    }

}

код рабочий проверял на таких входных даных:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013

Коляяяяяяяяяяяяяяяяяяяяяяяяяяяяя 18 5 2012

Василенко Васяяяяяяяяяяяяяяяяяяяяяяяяяяяя Васильевич 17 11 1991

вывод такой:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
Коляяяяяяяяяяяяяяяяяяяяяяяяяяяяя 18 5 2012
Василенко Васяяяяяяяяяяяяяяяяяяяяяяяяяяяя Васильевич 17 11 1991
Docktor91
я тебе про это
& array.length<7
nevazno
  • nevazno
  • 0
  • Комментарий отредактирован 2014-09-11 17:11:00 пользователем nevazno
Просто я думал что имя может быть только с трёх слов так как в примере и поэтому так сделал. убрал, получилось вот так:
<code>if (array.length>3 )
                    for(int i =0;i<array.length;i++){</code>
не приняло
nevazno
меня смущает вот этот комментарий, я не могу понять до конца что он изменил, чтобы попробовать, может причина таится именно в этом?
nevazno
вот из-за этого комента я поставил array.length>3 & array.length<7
Docktor91
может быть, раз это не помогло, то используйте SimpleDateFormat
SimpleDateFormat format=new SimpleDateFormat("dd-mm-yyyy");//сдесь укажи сам формат который нужен

используйте методы parse и format
nevazno
Вот тут я не сильно понимаю что и как делать, если мы делаем вот так:
SimpleDateFormat birthdayFormat = new SimpleDateFormat("dd MM yyyy", Locale.ENGLISH);
            Calendar birthdayCalendar = new GregorianCalendar();
            String birthday = birthdayFormat.format(birthdayCalendar.getTime());

Получается мы перевели дату в String. Но в Person добавить не можем так как:
public class Person {
    private String name;
    private Date birthday;

Что то я запутался (
nevazno
задачу оставил до лучших времен.
LastLost
SimpleDateFormat, функция parse
Как-то так
Docktor91
откажитесь от этого
Calendar birthdayCalendar = new GregorianCalendar();
isaenkovl
Подскажите пожалуйста, что из условий я не выполнил?
Цитирую:
«В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя день месяц год
где [имя] — может состоять из нескольких слов, разделенных пробелами, и имеет тип String
[день] — int, [месяц] — int, [год] — int
данные разделены пробелами»
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args){

            try
            {
                BufferedReader reader = new BufferedReader(new FileReader(args[0]));

                while (reader.ready())
                {
                    String temp = reader.readLine();
                    String[] arrayTemp = temp.split(" ");

                    int year = Integer.parseInt(arrayTemp[arrayTemp.length - 1]);
                    int mount = Integer.parseInt(arrayTemp[arrayTemp.length - 2]);
                    int day = Integer.parseInt(arrayTemp[arrayTemp.length - 3]);

                    String name = temp.substring(0, temp.length() - 11);

                    Calendar calendar = new GregorianCalendar(year, mount - 1, day);
                    Date date = calendar.getTime();

                    PEOPLE.add(new Person(name, date));
                }
                reader.close();
            }
            catch (IOException e)
            {

            }
    }
}

Надеюсь на ответ от авторов задания. Хотя благодарностей за поддержку проекта так и не получал…
moreno
  • moreno
  • +1
  • Комментарий отредактирован 2014-11-06 14:10:28 пользователем moreno
Вот здесь, по-моему, неправильно:
String name = temp.substring(0, temp.length() - 11);
Посчитайте количество символов дня рождения Васи
isaenkovl
Спасибо. Изменил логику — прошло. Туплю
bskydive
Что не учёл?
Ввод:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
qqq
qqq qq qq qq 1 2 3
aa aa aa a 2 20
aa

Вывод:
Thu Dec 31 00:00:00 MSK 1987: Иванов Иван Иванович
Wed May 15 00:00:00 MSK 2013: Вася


package com.javarush.test.level19.lesson10.home03;

import java.io.File;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/* Хуан Хуанович
В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя день месяц год
где [имя] - может состоять из нескольких слов, разделенных пробелами, и имеет тип String
[день] - int, [месяц] - int, [год] - int
данные разделены пробелами

Заполнить список PEOPLE импользуя данные из файла
Закрыть потоки

Пример входного файла:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
*/

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

    public static void main(String[] args)
    {

        if (args==null || args.length<1) System.exit(1);

        Scanner inputFile=null;

        try{
            inputFile = new Scanner(new File(args[0]));
        } catch (FileNotFoundException e){
            e.printStackTrace();
            System.exit(1);
        }


        Map<String,Date> map = new HashMap<>();

        String[] midStr;
        int maxInd=0;
        String name="";
        Date date;

        try{
            while (inputFile.hasNext()) {
                midStr = inputFile.nextLine().split(" ");
                maxInd = midStr.length;
                if (maxInd<3 || maxInd>6) continue;
                name = midStr[0];

                for (int i=1;i<maxInd-3;i++) name+=" "+midStr[i];

                try{
                    date = new SimpleDateFormat("dd MM yyyy").parse(midStr[maxInd-3]+" "+midStr[maxInd-2]+" "+midStr[maxInd-1] );
                    map.put(name, date);
                }catch (ParseException e)
                {
                }

            }

            for (Map.Entry<String,Date> m: map.entrySet()) {
                Person p = new Person(m.getKey(),m.getValue());
                PEOPLE.add(p);
            }
        }

        finally
        {
            inputFile.close();
        }

    }

}

bulldorez
Люди, что не так? Вроде, работает правильно. Подскажите, какую ошибку я не вижу7
?

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

    public static void main(String[] args) throws IOException
    {
        String f = "d:\\tmp";
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f)));

        while (reader.ready())
        {
            String str = reader.readLine().replace(String.valueOf((char) 65279), "");
            String[] strArray = str.split(" ");
            int countOfSplits = strArray.length;
            int year = Integer.parseInt(strArray[countOfSplits-1]);
            int month = Integer.parseInt(strArray[countOfSplits-2]);
            int day = Integer.parseInt(strArray[countOfSplits-3]);
            StringBuffer name = new StringBuffer();
            for (int i = 0; i < countOfSplits - 3; i++)
            {
                name.append(strArray[i]);
                if (i < countOfSplits - 4) name.append(" ");
            }

            Date d = new Date(year, month-1, day);
            Person p = new Person(name.toString(), d);
            PEOPLE.add(p);
        }

        reader.close();

    }

}
Maksym
В метод main первым параметром приходит имя файла.
Тут треба масив args обробити
bulldorez
ошибся, когда код вылаживал. С arg тоже не проходит
Kosolap
  • Kosolap
  • 0
  • Комментарий отредактирован 2015-03-09 20:24:02 пользователем Kosolap
При вводе:

Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
Боря 16 9 1951
Ирина Анатольевна 16 4 1960


Ваш код заносит в список следующее:

Иванов Иван Иванович Sat Dec 31 00:00:00 EET 3887
Вася Thu May 15 00:00:00 EET 3913
Боря Tue Sep 16 00:00:00 EET 3851
Ирина Анатольевна Mon Apr 16 00:00:00 EET 3860


видно в чём проблема?)
bulldorez
нет, не понимаю, что тут не так. Заносится в формате Date. Я могу вытянуть день, месяц, год. Почему нужно пользовать Callendar, а не Date, я не понял…
bulldorez
  • bulldorez
  • 0
  • Комментарий отредактирован 2015-03-22 01:15:02 пользователем bulldorez
При использовании Callendar выводится Thu Dec 31 00:00:00 BRST 1987. В чем разница и почему задача принялась?
bulldorez
Нанял экстрасенса. Оказалось, что вместо Date нужно использовать Callendar
grishin
У меня тоже завтык с этой задачей. Пробелов лишних в имени нет. Исключения обрабатываю через try-catch. Все выводы соответствуют. Чего ему ещё не хватает?
public class Solution {

    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) {

        Scanner fileScanner = null;

        try
        {
            fileScanner = new Scanner(new FileReader(args[0]));

            while (fileScanner.hasNextLine())
            {
                //reading name
                String name = new String();
                while (!fileScanner.hasNextInt()) name = name + fileScanner.next() + " ";
                name = name.trim();

                //reading birthday
                int[] dateDetails = new int[3];
                for (int i = 0; i < dateDetails.length; i++) dateDetails[i] = fileScanner.nextInt();

                //add a person to the list
                Date birthday = new GregorianCalendar(dateDetails[2], dateDetails[1] - 1, dateDetails[0]).getTime();
                PEOPLE.add(new Person(name, birthday));

                //move to new line
                fileScanner.nextLine();
            }
        } catch (IOException e) { }
        finally {
            if (fileScanner != null) fileScanner.close();
        }


//        for (Person person : PEOPLE) System.out.println(person.getName() + " " + person.getBirthday());
    }
}
grishin
Добавил ещё один catch (Exception e) { } — пропустило.
serfer
Когда на 3 или 4 уровне писали что не стоит использовать Scanner то это не с фонаря.
RustedBrain
package com.javarush.test.level19.lesson10.home03;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/* Хуан Хуанович
В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя день месяц год
где [имя] - может состоять из нескольких слов, разделенных пробелами, и имеет тип String
[день] - int, [месяц] - int, [год] - int
данные разделены пробелами

Заполнить список PEOPLE импользуя данные из файла
Закрыть потоки

Пример входного файла:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
*/

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

    public static void main(String[] args) {
        //args = new String[]{"D:\\\\TestFiles\\1.txt"};
        if (args.length < 1)
            return;

        BufferedReader fileReader;

        try {
            fileReader = new BufferedReader(new FileReader(args[0]));
        } catch (Exception a) {
            return;
        }

        ArrayList<String> strings = new ArrayList<>();

        try {

            while (fileReader.ready()) {
                strings.add(fileReader.readLine());
            }
        } catch (Exception a) {

        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("dd mm yyyy");

        for (int i = 0; i < strings.size(); i++) {
            String name = "";
            String bd = "";
            for (int j = 0; j < strings.get(i).length(); j++) {
                if (Character.isLetter(strings.get(i).charAt(j))) {
                    if (j > 0 && strings.get(i).charAt(j - 1) == ' ' && !name.isEmpty())
                        name += ' ';
                    name += strings.get(i).charAt(j);
                } else if (Character.isDigit(strings.get(i).charAt(j))) {
                    if (j > 0 && strings.get(i).charAt(j - 1) == ' ' && !bd.isEmpty())
                        bd += ' ';
                    bd += strings.get(i).charAt(j);
                }
            }

            try {
                if (!name.isEmpty() && !bd.isEmpty()) {
                    byte[] utf8Bytes = name.getBytes("UTF-8");
                    String nameInUTF = new String(utf8Bytes, "UTF-8");
                    PEOPLE.add(new Person(nameInUTF, dateFormat.parse(bd)));
                }
            } catch (Exception a) {

            }
        }

        try {
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //for (int i = 0; i < PEOPLE.size(); i++) {
        //   System.out.println(PEOPLE.get(i).getName() + " " + PEOPLE.get(i).getBirthday());
        //}
    }
}

Подскажите пожалуйста где может быть ошибка.
igorzahar
Не пойму, зачем усложнять самому себе задание…
Обработка исключений в данной задаче не играет никакой роли, достаточно считать данные из файла построчно, воспользоваться split, Calendar, и конечно не забыть отсечь последний пробел в имени (сам погорел в первой попытке), когда будешь его собирать из массива строк (после использования split). Все решение в десяток строк.
И еще, не важно из скольких слов состоит имя, всегда 3 последних это месяц, день, год.
serfer
Вот я то на календаре(его отсутствие и попал на пару попыток ). Все остальное настрочил через эксепсины.
Midnightcom
Вроде задача не сложная, а вот решение не проходит ((. Где я ошибся? I need your help, please!
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/* Хуан Хуанович
В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя день месяц год
где [имя] - может состоять из нескольких слов, разделенных пробелами, и имеет тип String
[день] - int, [месяц] - int, [год] - int
данные разделены пробелами

Заполнить список PEOPLE импользуя данные из файла
Закрыть потоки. Не использовать try-with-resources

Пример входного файла:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
*/

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

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

        BufferedReader reader = new BufferedReader(new FileReader(args[0]));
        String line;
        String[] resStr;
        String[] resInt;
        while((line = reader.readLine()) != null) {
            String[] resLine = line.split(" ");
            resStr = Arrays.copyOfRange(resLine, 0, resLine.length - 3);
            resInt = Arrays.copyOfRange(resLine, resLine.length-3, resLine.length);

            String name = Arrays.toString(resStr);

            int day = Integer.parseInt(resInt[0]);
            int month = Integer.parseInt(resInt[1]);
            int year = Integer.parseInt(resInt[2]);

            Date birthday = new Date(day, month, year);

            PEOPLE.add(new Person(name, birthday));
        }

        reader.close();

    }

}
gorlumka
  • gorlumka
  • 0
  • Комментарий отредактирован 2015-10-06 17:46:37 пользователем gorlumka
тоже не работает. при подставлянии своего файла, все, вроде, пашет.
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) throws IOException
    {
        String file = args[0];
        BufferedReader reader = new BufferedReader(new FileReader(file));
        ArrayList<String> list = new ArrayList<>();
        String line;
        while ((line = reader.readLine()) != null)
        {
            list.add(line);
        }
        reader.close();
        for (String x : list)
        {
            String [] s = x.split(" ");
            if ((s.length == 4))
            {
                try
                {
                    String name = s[0];
                    int day = Integer.parseInt(s[1]);
                    int month = Integer.parseInt(s[2]);
                    int year = Integer.parseInt(s[3]);
                    Date birthday = new Date(day, month, year);
                    PEOPLE.add(new Person(name, birthday));
                }
                catch (Exception e){}
            }
            if ((s.length == 5))
            {
                try
                {
                    String name = s[0] + " " + s[1];
                    int day = Integer.parseInt(s[2]);
                    int month = Integer.parseInt(s[3]);
                    int year = Integer.parseInt(s[4]);
                    Date birthday = new Date(day, month, year);
                    PEOPLE.add(new Person(name, birthday));
                }
                catch (Exception e) {}
            }
            if ((s.length == 6))
            {
                try
                {
                    String name = s[0] + " " + s[1] + " " + s[2];
                    int day = Integer.parseInt(s[3]);
                    int month = Integer.parseInt(s[4]);
                    int year = Integer.parseInt(s[5]);
                    Date birthday = new Date(day, month, year);
                    PEOPLE.add(new Person(name, birthday));
                }
                catch (Exception e) {}
            }
        }
    }

}
laz_a_rus
  • laz_a_rus
  • +1
  • Комментарий отредактирован 2015-10-06 18:53:27 пользователем laz_a_rus
А что будет если имя из четырех слов состоит или из пяти? Из условия понятно только то, что последние три «слова» это числа составляющие дату рождения — не значит ли это, что и считать нужно с конца?
<code>int month = Integer.parseInt(s.length - 2);</code>
И тогда можно будет обойтись без дублирования кода для каждого количества параметров.
Я все делал «на лету» без создания дополнительного листа: прочитал строку, разбил ее, на основе полученных данных создал «персону» и положил в итоговый лист.
gorlumka
спасибо. не подумал, что в имени может быть больше 3-х слов
Peras
Сломал уже голову, помогите! Где ошибка?
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) throws IOException, ParseException
    {
        BufferedReader reader = new BufferedReader(new FileReader(args[0]));
        while (reader.ready())
        {
            String[] s = reader.readLine().split(" ");
            StringBuilder nameToString = new StringBuilder();

            int[] d = new int[3];
            int count = 0;
            for(String x : s)
            try{
                int tmp = Integer.parseInt(x);
                d[count] = tmp;
                count++;
            }
            catch (Exception e)
            {
                nameToString.append(x).append(" ");
            }

            Date date = new GregorianCalendar(d[2], d[1], d[0]).getTime();
            String name = nameToString.toString();
            PEOPLE.add(new Person(name, date));
        }
        reader.close();
    }
}
alexaht
не пойму в чем проблема, по условию выполняет все
что не так?
public class Solution {
    public static final List<Person> PEOPLE = new ArrayList<Person>();

    public static void main(String[] args) throws Exception {
        String fileName = args[0];
        fillPerson(fileName);
        for (Person p : PEOPLE) {
            System.out.println(p.getName() + "|" + p.getBirthday());
        }
    }

    static void fillPerson(String fileName) throws Exception {
        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        while (reader.ready()) {
            String s = reader.readLine();
            if (!s.equals("")){
                String name = s.replaceAll("[\\p{Digit}]", "").trim();
                String birthday = s.replaceAll("\\p{javaAlphabetic}", "").trim();
                DateFormat dateFormat = new SimpleDateFormat("dd MM yyyy");
                Date date = dateFormat.parse(birthday);
                PEOPLE.add(new Person(name, date));
            }
        }
        reader.close();
    }

}
alexaht
  • alexaht
  • 0
  • Комментарий отредактирован 2016-04-07 11:08:19 пользователем alexaht
всем спасибо, уже нашел ошибку и переписал код… прошел проверку!!!
NNNeLeGaLLL
Помогите, пожалуйста! Не проходит тестирование!

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

    public static void main(String[] args)
    {
        try
        {
            String fileName = args[0];
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
            String line = "";

            while ((line = reader.readLine()) != null)
            {
                String[] stroka = line.split(" ");

                    int year = Integer.parseInt(stroka[stroka.length - 1]);
                    int month = Integer.parseInt(stroka[stroka.length - 2]);
                    int day = Integer.parseInt(stroka[stroka.length - 3]);
                    String name = "";
                    for (int i = 0; i < (stroka.length - 3); i++)
                    {
                        name += stroka[i] + " ";
                    }
                    name.trim();
                    Calendar birthdayCalendar = new GregorianCalendar(year, month - 1, day);
                    PEOPLE.add(new Person(name, birthdayCalendar.getTime()));
            }
            reader.close();
        }
        catch (IOException e){
        }
    }
}
Yuri_0504
Уберите try-catch
NNNeLeGaLLL
Убрал. Всё равно не проходит. Всю голову сломал себе уже с этой задачей
Yuri_0504
В импортах ничего лишнего нет?
Весь код еще раз покажите
NNNeLeGaLLL
Нет, лишнего вроде бы ничего.

package com.javarush.test.level19.lesson10.home03;


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

/* Хуан Хуанович
В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя день месяц год
где [имя] - может состоять из нескольких слов, разделенных пробелами, и имеет тип String
[день] - int, [месяц] - int, [год] - int
данные разделены пробелами

Заполнить список PEOPLE импользуя данные из файла
Закрыть потоки. Не использовать try-with-resources

Пример входного файла:
Иванов Иван Иванович 31 12 1987
Вася 15 5 2013
*/

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

    public static void main(String[] args) throws IOException
    {
            String fileName = args[0];
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
            String line = "";

            while ((line = reader.readLine()) != null)
            {
                String[] stroka = line.split(" ");

                    int year = Integer.parseInt(stroka[stroka.length - 1]);
                    int month = Integer.parseInt(stroka[stroka.length - 2]);
                    int day = Integer.parseInt(stroka[stroka.length - 3]);
                    String name = "";
                    for (int i = 0; i < (stroka.length - 3); i++)
                    {
                        name += stroka[i] + " ";
                    }
                    name.trim();
                    Calendar birthdayCalendar = new GregorianCalendar(year, month - 1, day);
                    PEOPLE.add(new Person(name, birthdayCalendar.getTime()));

            }
            reader.close();

    }

}

import java.util.Date;

public class Person {
    private String name;
    private Date birthday;

    public Person(String name, Date birthday) {
        this.name = name;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public Date getBirthday() {
        return birthday;
    }
}
Yuri_0504
Я же вам на help.javarush.ru отвечал, зачем там вопрос удалили?
bkozhaev
Наверное уже поздно с подсказкой, но все таки я думаю что здесь будет полезнее использовать try & catch на случай если имя состоит из четырех слов «как описано выше», да и просто код упрощается на много.

в try переводим стринг в целое
в catch если выскакивает ошибка при переводе стринга в целое, записываем стринг как имя (т.е. name)
к примеру вот так:
while (reader.ready()) {
            String[] line = reader.readLine().split(" ");

            for (String x : line) {

                try {
                    int num1 = Integer.parseInt((x));
                    birthday += num1 + " ";
                } catch (NumberFormatException e) {
                    name += x + " ";
                }
            }


Последний пробел можно убрать методом substring.

Удачи.
VitaliiSedneff
Если используете класс Date
Используйте подсказку из спецификации.
Parameters:
year — the year minus 1900; must be 0 to 8099. (Note that 8099 is 9999 minus 1900.)
month — 0 to 11
day — 1 to 31
V-E-S-T
Всё как и всех — валидатор не принимает — подскажите в чём трабл? пробела между именем и датой нет.

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

    public static void main(String[] args) throws Exception
    {
        String file_name = "";
        for (int i = 0; i < args.length; ++i)
        {
            file_name += file_name + args[i];
        }

        String line;
        String year;
        String day;
        String month;
        Date date;
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd MM yyyy");
        BufferedReader file_reader = new BufferedReader(new FileReader(file_name));
        while (file_reader.ready())
        {
            line = file_reader.readLine();
            year = line.substring(line.lastIndexOf(" "));
            line = line.substring(0, line.indexOf(year));
            month = line.substring(line.lastIndexOf(" "));
            line = line.substring(0, line.indexOf(month));
            day = line.substring(line.lastIndexOf(" "));
            line = line.substring(0, line.indexOf(day));
            line = line.trim();
            date = dateFormat.parse(day + " " + month + " " + year);
            PEOPLE.add(new Person(line, date));
        }

        file_reader.close();

    }
}
egorn
Молю, подскажите в чем дело :(
package com.javarush.task.task19.task1921;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/* 
Хуан Хуанович
*/

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

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

       //String fileName = args[0];
        String fileName = "g:/source.txt";
        BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
        ArrayList<String> fileList = new ArrayList<String>();
        String input;
        int size;
        Date personDate;
        String personName;

        while ((input = fileReader.readLine()) != null) {
            fileList.add(input);

        }
        fileReader.close();


        for (String i: fileList)
        {
            String[] split = i.split(" ");
            size = split.length;

            int Year = Integer.parseInt(split[size-1]);
            int Month = Integer.parseInt(split[size-2]);
            int Day = Integer.parseInt(split[size-3]);

            personDate = new Date(Year,Month,Day);
            personName = getName(split, size-4);
            PEOPLE.add(new Person(personName, personDate));




        }
    }
public static String getName(String[] args, int index)
{
    StringBuilder res = new StringBuilder();
    for (int i = 0; i<=index; i++)
    {
        res.append(args[i]).append(" ");

    }
    return res.toString().trim();
}



}




zzzz
personDate = new Date(Year,Month,Day);

вот тут ошибка.

docs.oracle.com/javase/8/docs/api/java/util/Date.html#Date-int-int-int-

ПыСы: данный конструктор deprecated, не застревайте в старом коде.
egorn
Спасибо за помощь, но не помогло :((

package com.javarush.task.task19.task1921;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;

/* 
Хуан Хуанович
*/

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

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

       String fileName = args[0];
        //String fileName = "g:/source.txt";
        BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
        ArrayList<String> fileList = new ArrayList<String>();
        String input;
        int size;
        Date personDate;
        String personName;

        while ((input = fileReader.readLine()) != null) {
            fileList.add(input);

        }
        fileReader.close();


        for (String i: fileList)
        {
            String[] split = i.split(" ");
            size = split.length;

            int Year = Integer.parseInt(split[size-1]);
            int Month = Integer.parseInt(split[size-2]);
            int Day = Integer.parseInt(split[size-3]);
            
            personName = getName(split, size-4);
            PEOPLE.add(new Person(personName, new GregorianCalendar(Year, Month, Day).getTime()));




        }
    }
public static String getName(String[] args, int index)
{
    StringBuilder res = new StringBuilder();
    for (int i = 0; i<=index; i++)
    {
        res.append(args[i]).append(" ");

    }
    return res.toString().trim();
}



}




zzzz
  • zzzz
  • 0
new GregorianCalendar(Year, Month, Day)

Так вы теже «яйца» завернули в другую обертку.
Вы не избавились от ошбики.

Посмотрите какие значения Month принимают конструкторы Date и GregorianCalendar.
SanjaTi
  • SanjaTi
  • 0
  • Комментарий отредактирован 2017-07-18 20:58:25 пользователем SanjaTi
package com.javarush.task.task19.task1921;

import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/* 
Хуан Хуанович
*/

public class Solution {
public static final ListPEOPLE = new ArrayList();

public static void main(String[] args) throws IOException,ParseException
{
String argsO = «c:/bla.txt»;
FileReader fileReader = new FileReader(argsO);

Scanner scFile = new Scanner(fileReader);
StringBuilder sbStr = new StringBuilder();
StringBuilder sbDate = new StringBuilder();
SimpleDateFormat sdf = new SimpleDateFormat(«dd-MM-yyyy»);

while (scFile.hasNextLine())
{
String s= scFile.nextLine();
Scanner scStr = new Scanner(s);
while (scStr.hasNext())
{
String tmp = scStr.next();
if(!isInt(tmp))
{
sbStr.append(tmp + " ");
}else sbDate.append(tmp + " ");
}
scStr.close();
if(sbDate.length()>0&& sbStr.length()>0)
PEOPLE.add(new Person(sbStr.toString().trim(),sdf.parse(sbDate.toString().trim().replaceAll(" ","-"))));
sbDate.delete(0,sbDate.length());
sbStr.delete(0,sbStr.length());

}
scFile.close();
fileReader.close();
for(int i =0;i<PEOPLE.size();i++)
{
System.out.println(PEOPLE.get(i).getName() +" :: "+PEOPLE.get(i).getBirthday().toString());
}

}
public static boolean isInt(String s)
{

try {
Integer.parseInt(s);
return true;
}catch (NumberFormatException e)
{
return false;
}
}

}
Помогите плз, всё тестируется. Это вариант для удобства тестирования работы кода. Сдавал разумеется без цикла в конце мэйна и с параметром. Валидадтор всё зачёл, только считает что поток файл ридера не закрыт, а я его закрыл. Что не так подскажите.
SanjaTi
всё переписал без сканеров, одна строка, один цикл и куча ифов… работает, но совсем не так красиво как тут. Проверку прошёл.
chicha
  • chicha
  • 0
  • Комментарий отредактирован 2018-02-21 18:27:03 пользователем chicha
В чем может быть проблема, программа работает, тест не проходит
public class Solution {
public static final ListPEOPLE = new ArrayList();

public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(args[0]));
String list = "";
String[] stroka;

while ((list = reader.readLine()) != null) {
stroka = list.split(" ");
String name = "";
for(int i = stroka.length — 4; i >= 0; i--){
name = name + stroka[i] + " ";
}
name = name.trim();
Calendar calendar = new GregorianCalendar(Integer.parseInt(stroka[stroka.length-1]), Integer.parseInt(stroka[stroka.length-2]) — 1, Integer.parseInt(stroka[stroka.length-3]));
PEOPLE.add(new Person(name, calendar.getTime()));
}
reader.close();
}
}
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.