Смотритель: hubert
  • ,

task30.task3008 Чат(19)

не могу понять, в чем проблема, все работает как надо, но валидатор не принимает условие «Метод processIncomingMessage должен выводить на экран полученное сообщение message.»

public class BotClient extends Client {

public static void main(String[] args){
BotClient botClient = new BotClient();
botClient.run();
}
@Override
protected String getUserName() {

String botName = «date_bot_» + ((int)(Math.random()*100));
return botName;
}

@Override
protected boolean shouldSendTextFromConsole() {
return false;
}

@Override
protected SocketThread getSocketThread() {
return new BotSocketThread();
}

public class BotSocketThread extends Client.SocketThread{
@Override
protected void clientMainLoop() throws IOException, ClassNotFoundException {
sendTextMessage(«Привет чатику. Я бот. Понимаю команды: дата, день, месяц, год, время, час, минуты, секунды.»);
super.clientMainLoop();
}

@Override
protected void processIncomingMessage(String message) {

ConsoleHelper.writeMessage(message);

String[] messageSplit = message.split(": ");
String result = «Информация для » + messageSplit[0]+ ": ";
Calendar cal = Calendar.getInstance();

switch (messageSplit[1].trim()){
case «дата»:
result += new SimpleDateFormat(«d.MM.YYYY»).format(cal.getTime());
sendTextMessage(result);
break;
case «день»:
result += new SimpleDateFormat(«d»).format(cal.getTime());
sendTextMessage(result);
break;
case «месяц»:
result += new SimpleDateFormat(«MMMM»).format(cal.getTime());
sendTextMessage(result);
break;
case «год»:
result += new SimpleDateFormat(«YYYY»).format(cal.getTime());
sendTextMessage(result);
break;
case «время»:
result += new SimpleDateFormat(«H:mm:ss»).format(cal.getTime());
sendTextMessage(result);
break;
case «час»:
result += new SimpleDateFormat(«H»).format(cal.getTime());
sendTextMessage(result);
break;
case «минуты»:
result += new SimpleDateFormat(«m»).format(cal.getTime());
sendTextMessage(result);
break;
case «секунды»:
result += new SimpleDateFormat(«s»).format(cal.getTime());
sendTextMessage(result);
break;
}

}
}
}

task21.task2101

Помогите разобрать задачу
Задача решается с массивом int тривиально просто, однако создатели усложняют задачу приводя
значения типов int  к значениям типов byte, который в свою очередь имеет значения от -127 до +128
и в связи с этим уходят в отрицательный диапазон.
Можно конечно городить забор из приведения к типам, но валидатор точно это не оценит.
Что делать??
/* 
Определяем адрес сети
*/
public class Solution {
    public static void main(String[] args) {
        byte[] ip = new byte[]{(byte) 192, (byte) 168, 1, 2};
        byte[] mask = new byte[]{(byte) 255, (byte) 255, (byte) 254, 0};
        byte[] netAddress = getNetAddress(ip, mask);
        print(ip);          //11000000 10101000 00000001 00000010
        print(mask);        //11111111 11111111 11111110 00000000
        print(netAddress);  //11000000 10101000 00000000 00000000
    }

    public static byte[] getNetAddress(byte[] ip, byte[] mask) {
        return new byte[4];
    }

    public static void print(byte[] bytes) {
    }
}
  • ,

task36.task3607

Описание класса:
1. Реализует интерфейс Queue.
2. Используется при работе с трэдами.
3. Из этой очереди элементы могут быть взяты только тогда, когда они заэкспарятся, их время задержки истекло.
4. Головой очереди является элемент, который заэкспарился раньше всех.

Мой код — возвращает верное значение в ИДЕЕ, но валидатору что-то не нравится.
Попробовал запустить задачу в браузере — на выходе null.
Возник по ходу вопрос, а как java.util.* работает в браузере, если его нету в classpath?
Буду благодарен за любую подсказку:

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/*
Найти класс по описанию
*/
public class Solution {
    public static void main(final String[] args) {
        System.out.println(getExpectedClass());
    }
    public static Class getExpectedClass() {
        final Set<String> classNames = new HashSet<>();
        final URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        final URL[] jarsPath = classLoader.getURLs();
        //find classes within rt.jar package
        for (final URL jarPath : jarsPath) {
            if (jarPath.toString().endsWith("rt.jar")) {
                try {
                    final JarFile jarFile = new JarFile(jarPath.getPath().toString());
                    final Enumeration<JarEntry> en = jarFile.entries();
                    while (en.hasMoreElements()) {
                        final String fileName = en.nextElement().getName();
                        if (fileName.startsWith("java/util") && fileName.endsWith(".class")) {
                            classNames.add(fileName);
                        }
                    }
                } catch (final IOException ignored) {
                }
            }
        }
        //find class with Queue interface implementation
        for (final String className : classNames) {
            try {
                final String fileName = className.substring(0, className.length() - 6).replace('/', '.');
                final Class cls = Class.forName(fileName);
                if (Queue.class.isAssignableFrom(cls) && cls.getEnclosingClass() == null) {
                    final Field[] fields = cls.getDeclaredFields();
                    final Method[] methods = cls.getDeclaredMethods();
                    if (Arrays.stream(methods)
                            .filter(m -> m.getName().contains("peekExpired"))
                            .flatMap(m -> Arrays.stream(fields))
                            .anyMatch(f -> f.getType().equals(Thread.class))) {
                        return cls;
                    }
                }
            } catch (final ClassNotFoundException ignored) {
            }
        }
        return null;
    }
}
  • ,

package com.javarush.task.task20.task2002; подскажите что не так друзья!

package com.javarush.task.task20.task2002;

import java.io.*;
import java.text.DateFormat;
import java.text.FieldPosition;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/* 
Читаем и пишем в файл: JavaRush

Реализуйте логику записи в файл и чтения из файла для класса JavaRush.
В файле your_file_name.tmp может быть несколько объектов JavaRush.
Метод main реализован только для вас и не участвует в тестировании.


Требования:
1. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если список users пустой.
2. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если список users не пустой.
3. Класс Solution.JavaRush не должен поддерживать интерфейс Serializable.
4. Класс Solution.JavaRush должен быть публичным.
5. Класс Solution.JavaRush не должен поддерживать интерфейс Externalizable.
*/
public class Solution {
    public static void main(String[] args) {
        //you can find your_file_name.tmp in your TMP directory or fix outputStream/inputStream according to your real file location
        //вы можете найти your_file_name.tmp в папке TMP или исправьте outputStream/inputStream в соответствии с путем к вашему реальному файлу
        try {
            File your_file_name = new File("c:\\0\\4.txt");
            OutputStream outputStream = new FileOutputStream(your_file_name);
            InputStream inputStream = new FileInputStream(your_file_name);

            JavaRush javaRush = new JavaRush();

            //формат даты SimpleDateFormat
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

            User ivan = new User();
            ivan.setFirstName("Иванов");
            ivan.setLastName("Иван");
            Date Bdate = new Date();
            Bdate = dateFormat.parse("01/05/1992");

            ivan.setBirthDate(Bdate);
            ivan.setMale(true);
            ivan.setCountry(User.Country.RUSSIA);

            User vasya = new User();
            vasya.setFirstName("Васильев");
            vasya.setLastName("Василий");
            Date bDate = new Date();
            bDate = dateFormat.parse("05/06/1976");
            vasya.setBirthDate(bDate);
            vasya.setMale(true);
            vasya.setCountry(User.Country.UKRAINE);

            javaRush.users.add(ivan);
            javaRush.users.add(vasya);



            //initialize users field for the javaRush object here - инициализируйте поле users для объекта javaRush тут
            javaRush.save(outputStream);

            outputStream.flush();

            JavaRush loadedObject = new JavaRush();
            loadedObject.load(inputStream);
            //check here that javaRush object equals to loadedObject object - проверьте тут, что javaRush и loadedObject равны
            if(javaRush.equals(loadedObject)){
                System.out.println("Загрузка прошла удачно");
            }else{
                System.out.println("Загрузка неудачна");
            }
            outputStream.close();
            inputStream.close();

/*
 //тестовая печать

            for(User u:javaRush.users){
                System.out.println(u.toString());
                System.out.println(u.getFirstName());
                System.out.println(u.getLastName());
                System.out.println(u.getBirthDate());
                System.out.println(u.isMale());
                System.out.println(u.getCountry());


                System.out.println("________________________");
            }

*/
        } catch (IOException e) {
            //e.printStackTrace();
            System.out.println("Oops, something wrong with my file");
        } catch (Exception e) {
            //e.printStackTrace();
            System.out.println("Oops, something wrong with save/load method");
        }
    }

    public static class JavaRush {
        public List<User> users = new ArrayList<>();

        public void save(OutputStream outputStream) throws Exception {
            //implement this method - реализуйте этот метод
            PrintWriter printWriter = new PrintWriter(outputStream);
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            printWriter.println("<newObject>");
            printWriter.println(users.size());
            if(users.size()>0){
                for(User u:users){
                    //printWriter.println(u);
                    printWriter.println(u.getFirstName());
                    printWriter.println(u.getLastName());
                    String sd = dateFormat.format(u.getBirthDate());

                    printWriter.println(sd);
                    printWriter.println(u.isMale());
                    printWriter.println(u.getCountry());
                }
            }

            printWriter.flush();
            printWriter.close();
        }

        public void load(InputStream inputStream) throws Exception {
            //implement this method - реализуйте этот метод
            BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            String line;
            while ((line=fileReader.readLine())!=null) {
                if (line.equals("<newObject>")) {


                    int size = Integer.parseInt(fileReader.readLine());
                    for (int i = 0; i < size; i++) {
                        User user = new User();
                        user.setFirstName(fileReader.readLine());
                        user.setLastName(fileReader.readLine());
                        Date bd = new Date();
                        bd = dateFormat.parse(fileReader.readLine());
                        user.setBirthDate(bd);
                        user.setMale(Boolean.parseBoolean(fileReader.readLine()));
                        user.setCountry(User.Country.valueOf(fileReader.readLine()));

                        users.add(user);
                    }
                }


            }






            fileReader.close();
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            JavaRush javaRush = (JavaRush) o;

            return users != null ? users.equals(javaRush.users) : javaRush.users == null;

        }

        @Override
        public int hashCode() {
            return users != null ? users.hashCode() : 0;
        }
    }
}
  • ,

com.javarush.task.task05.task0525;

package com.javarush.task.task05.task0525;

/*
И целой утки мало
*/

public class Solution {

public static void main(String[] args) {
Duck duck1 = new Duck();
Duck duck2 = new Duck();
System.out.println(duck1);
System.out.println(duck2);
//напишите тут ваш код
}

public static class Duck {
public String toString() {
return «Duck»;
}
}

Где берется toSring()?
Почему другое имя метода не подходит?
Почему это именно так работает?
Если он где-то прописан, в библиотеке, где import?
Если он где-то прописан, почему вдруг у меня появляется возможность называть им свой метод?

task.task18.task1828 совет по решению

Коллеги, посмотрите код, уже сам не могу вменяемо оценить, где ошибаюсь?
Решал через LinkedHashMap. Идея простая. Выделил ID из строки, и занес в мапу
(ID, полный String);
После по ключу ищу что сделать,
если удалять, то по ID,
если заменить, то клею строку из данных, потом в мапу заношу.
После все заливаю write. Но явно где то что то не так по реализации.

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

Требования:
1. Программа должна считать имя файла для операций CrUD с консоли.
2. При запуске программы без параметров список товаров должен остаться неизменным.
3. При запуске программы с параметрами "-u id productName price quantity" должна обновится информация о товаре в файле.
4. При запуске программы с параметрами "-d id" строка товара с заданным id должна быть удалена из файла.
5. Созданные для файлов потоки должны быть закрыты.

package com.javarush.task.task18.task1828;

/*
Прайсы 2
*/

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

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();
        Map<Integer, String> map = new LinkedHashMap<>();
        BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "Cp1251"));
        while (in.ready()) {
            String str1 = in.readLine();
            int id1 = Integer.parseInt(str1.substring(0, 8).replaceAll("\\D", ""));
            map.put(id1, str1);
        }
        if (args[0].equals("-u")) {
            String productname = args[2];
            for (int l = 3; l < args.length - 2; l++) productname += " " + args[l];
            String str3 = String.format("%-8.8s%-30.30s%-8.8s%-4.4s%n", String.valueOf(args[1]), productname, args[args.length - 2], args[args.length - 1]);
            map.put(Integer.parseInt(args[1]), str3);
        }
        if (args[0].equals("-d")) {
            map.remove(Integer.parseInt(args[1]));
        }

        in.close();
        BufferedWriter fileWR = new BufferedWriter(new FileWriter(fileName));
        for(Map.Entry<Integer, String> entry: map.entrySet()){
            String str4 = entry.getValue();
            fileWR.write(str4);
        }
        fileWR.close();
    }

task13.task1326

package com.javarush.task.task13.task1326;

/* 
Сортировка четных чисел из файла
*/


import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(new FileInputStream("c:/gek/1.txt"));
        ArrayList<Integer> list = new ArrayList<>();
        while (scanner.hasNext()) {
            int num = scanner.nextInt();
            if (num%2==0)
                list.add(num);
        }
        scanner.close();
        Collections.sort(list);
        for (Integer arr : list) {
            System.out.println(arr);
        }
    }
}


Что не так?
В файле это:
12
11
1374
156
112
354
9484
3112
1314
6565
64654654
641321324
64

Программа выдает:
12
64
112
156
354
1314
1374
3112
9484
64654654
641321324

Несколько раз по разному переписывал код и не принимает.
  • ,

task33.task3310 Shortener

Имеется следующее условие: Нам потребуется несколько вспомогательных классов:

4.1. Создай класс Helper.

4.1.1. Добавь в него статический метод String generateRandomString(), который будет генерировать случайную строку. Воспользуйся для этого классами SecureRandom и BigInteger. Подсказка: гугли запрос «random string java«.

4.1.2. Добавь в класс статический метод printMessage(String message). Он должен выводить переданный текст в консоль. Весь дальнейший вывод в программе должен быть реализован через этот метод!

4.2. Создай класс ExceptionHandler.

4.2.1. Добавь в него статический метод log(Exception e), который будет выводить краткое описание исключения.

Требования:

1. Метод generateRandomString класса Helper должен генерировать случайную строку используя способ описанный в условии задачи.

2. Метод printMessage класса Helper должен выводить переданный текст на экран.

3. Метод log класса ExceptionHandler должен выводить на экран краткое описание исключения.

Валидатор не принимает код, выдает, что «Метод generateRandomString класса Helper должен генерировать случайную строку используя способ описанный в условии задачи.» У кого прошла задача, подскажите, что не так

package com.javarush.task.task33.task3310;
import java.math.BigInteger;
import java.security.SecureRandom;
public class Helper {
public static String generateRandomString(){
SecureRandom secureRandom = new SecureRandom();
BigInteger bigInteger = new BigInteger(100, secureRandom);
return bigInteger.toString(32);
}
public static void printMessage(String message){
System.out.println(message);
}
}
  • ,

task33.task3310 Shortener

Имеется следующее условие: Нам потребуется несколько вспомогательных классов:

4.1. Создай класс Helper.

4.1.1. Добавь в него статический метод String generateRandomString(), который будет генерировать случайную строку. Воспользуйся для этого классами SecureRandom и BigInteger. Подсказка: гугли запрос «random string java«.

4.1.2. Добавь в класс статический метод printMessage(String message). Он должен выводить переданный текст в консоль. Весь дальнейший вывод в программе должен быть реализован через этот метод!

4.2. Создай класс ExceptionHandler.

4.2.1. Добавь в него статический метод log(Exception e), который будет выводить краткое описание исключения.

Требования:

1. Метод generateRandomString класса Helper должен генерировать случайную строку используя способ описанный в условии задачи.

2. Метод printMessage класса Helper должен выводить переданный текст на экран.

3. Метод log класса ExceptionHandler должен выводить на экран краткое описание исключения.

Валидатор не принимает код, выдает, что «Метод generateRandomString класса Helper должен генерировать случайную строку используя способ описанный в условии задачи.» У кого прошла задача, подскажите, что не так

package com.javarush.task.task33.task3310;
import java.math.BigInteger;
import java.security.SecureRandom;
public class Helper {
public static String generateRandomString(){
SecureRandom secureRandom = new SecureRandom();
BigInteger bigInteger = new BigInteger(100, secureRandom);
return bigInteger.toString(32);
}
public static void printMessage(String message){
System.out.println(message);
}
}
  • ,

package com.javarush.task.task19.task1927 задача не проходит

package com.javarush.task.task19.task1927;

/* 
Контекстная реклама

В методе main подмени объект System.out написанной тобой реадер-оберткой.
Твоя реадер-обертка должна выводить на консоль контекстную рекламу после каждого второго println-а.
Вызови готовый метод printSomething(), воспользуйся testString.
Верни переменной System.out первоначальный поток.

Рекламный текст: «JavaRush — курсы Java онлайн»

1. Класс Solution должен содержать класс TestString.
2. Класс Solution должен содержать публичное статическое поле testString типа TestString, которое сразу проинициализировано.
3. Класс TestString должен содержать публичный void метод printSomething().
4. Метод printSomething() класса TestString должен выводить на экран строки: "first","second","third","fourth","fifth".
5. Метод main(String[] args) класса Solution должен создавать поток PrintStream (используй PrintStream c параметром конструктора ByteArrayOutputStream).
6. Метод main(String[] args) класса Solution должен подменять и восстанавливать поток вывода в консоль объекта System.out.
7. Метод main(String[] args) класса Solution должен вызывать метод printSomething(),объекта testString.
8. Метод main(String[] args) класса Solution должен модифицировать строки(вставлять контекстную рекламу) выведенные методом printSomething() согласно заданию, и выводить её в консоль.
*/

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

public class Solution {
    public static TestString testString = new TestString();

    public static void main(String[] args) {
        // запомним текущую переменную
        PrintStream printStream = System.out;
        //создадим динамический массив
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //обернем его в PrintStream
        PrintStream stream = new PrintStream(baos);

        System.setOut(stream);
        testString.printSomething();

        System.setOut(printStream);
        String reklama = "«JavaRush — курсы Java онлайн»";
        String sS = baos.toString();
        String[] masS = sS.split("\\r\\n");

        for(int i=0;i<masS.length;i++){
            if(i%2==0 && i>0){
                System.out.println(reklama);
            }
            System.out.println(masS[i]);
        }



    }


    public static class TestString {
        public void printSomething() {
            System.out.println("first");
            System.out.println("second");
            System.out.println("third");
            System.out.println("fourth");
            System.out.println("fifth");
            
        }
    }
}


Пожалуйста объясните, что здесь не так. Удалил, перерешал — вышло ровно как и в первый раз.

task08.lesson11.task06 (task0824) - ошибка в использовании массива

Ошибка работы возникает в строчке
Human father = new Human(«Oleg», true, 30, child1, child2, child3);
Помогите разобраться, какая ошибка заложена в приведенном ниже коде

package com.javarush.task.task08.task0824;

import java.util.ArrayList;

public class Solution {
public static void main(String[] args) {
//напишите тут ваш код
Human child1 = new Human(«Alex», true, 5);
Human child2 = new Human(«Mary», false, 7);
Human child3 = new Human(«John», false, 9);
Human father = new Human(«Oleg», true, 30, child1, child2, child3);
Human mother = new Human(«Olga», false, 29, child1, child2, child3);
Human grandMotherOfFather = new Human(«Anna», false, 70, father);
Human grandFatherOfFather = new Human(«Nikola», true, 72, father);
Human grandMotherOfMother = new Human(«Alla», false, 71, mother);
Human grandFatherOfMother = new Human(«Nikita», true, 73, mother);
System.out.println(child1.toString());
System.out.println(child2.toString());
System.out.println(child3.toString());
System.out.println(father.toString());
System.out.println(mother.toString());
System.out.println(grandMotherOfFather.toString());
System.out.println(grandFatherOfFather.toString());
System.out.println(grandMotherOfMother.toString());
System.out.println(grandFatherOfMother.toString());
}

public static class Human {
//напишите тут ваш код
public String name;
public boolean sex;
public int age;
public ArrayListchildren;
public Human(String name, boolean sex, int age){
this.name = name;
this.sex = sex;
this.age = age; }
public Human(String name, boolean sex, int age, Human… children){
this.name = name;
this.sex = sex;
this.age = age;
for(Human child: children)
this.children.add(child); }

public String toString() {
String text = "";
text += «Имя: » + this.name;
text += ", пол: " + (this.sex? «мужской»: «женский»);
text += ", возраст: " + this.age;

int childCount = this.children.size();
if (childCount > 0) {
text += ", дети: " + this.children.get(0).name;

for (int i = 1; i < childCount; i++) {
Human child = this.children.get(i);
text += ", " + child.name;
}
}
return text;
}
}
}

  • ,

level22.lesson05.task01 (task2202) - работает, не проходит проверку - РЕШЕНО

Условие задачи:

Найти подстроку
Метод getPartOfString должен возвращать подстроку начиная с символа после 1-го пробела и до конца слова,
которое следует после 4-го пробела.

Пример:
«JavaRush — лучший сервис обучения Java.»

Результат:
«— лучший сервис обучения»

На некорректные данные бросить исключение TooShortStringException (сделать исключением).

Требования:
1. Класс TooShortStringException должен быть потомком класса RuntimeException.
2. Метод getPartOfString должен принимать строку в качестве параметра.
3. В случае, если строка, переданная в метод getPartOfString содержит менее 4 пробелов должно возникнуть исключение TooShortStringException.
4. Метод getPartOfString должен возвращать подстроку начиная с символа после 1-го пробела и до конца слова, которое следует после 4-го пробела.
Мой код:
package com.javarush.task.task22.task2202;

/* 
Найти подстроку
*/
public class Solution {
    public static void main(String[] args) {
        System.out.println(getPartOfString("JavaRush - лучший сервис обучения Java."));
        System.out.println(getPartOfString("JavaRush - лучший сервис обучения."));
        System.out.println(getPartOfString("JavaRush - лучший сервис."));

    }

    public static String getPartOfString(String string) throws TooShortStringException {
        int index = 0;
        /*for (int i = 0, j = 0; i < 4; i++) {
            index = string.indexOf(' ',j);
            if (index < 0) throw  new TooShortStringException();
            j = index + 1;
        }*/
        int count = 0, j = 0;
        while (true) {
            index = string.indexOf(' ',j);
            if (index < 0) break;
            else count++;
            if (count == 4) break;
            j = index + 1;
        }
        //if (count < 4) throw new TooShortStringException();
        int i = index + 1;
        while (!string.substring(i,i+1).matches("^(\\p{Punct}| )$")) {
            i++;
        }
        try {
            String result = string.substring(string.indexOf(' ') + 1, i);
            return result;
        } catch (Exception e) {
            throw new TooShortStringException();
        }
    }

    public static class TooShortStringException extends RuntimeException {
    }
}