level22.lesson05.task02

>Метод getPartOfString должен возвращать подстроку между первой и второй табуляцией.
На некорректные данные бросить исключение TooShortStringException.
Класс TooShortStringException не менять.



строка между табуляциями возвращается, но с приемом проблемы
1. что подразумевается под некорректными данными?
попробовал и проверять строку на нулевую длину и считать количество '\t' если меньше двух

проверка строки на null также не помогла

2. бросать — через сигнатуру метода, или выводить стектрейс внутри?

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

Sant9Iga
1)если нету табуляций, если нету второй табуляции
2)может не правильно вопрос понимаю… но кажись все исключения бросаются throw new BlaBla()
billybonce
видимо в тот момент перемудрил с проверками «корректности». сейчас переписал — код уменьшился в 3 раза и прошло :)
Vadim625
В чем тут проблема, вроде все делает как надо

public class Solution {
    public static String getPartOfString(String string) throws TooShortStringException{
        if (string == null){

            throw new TooShortStringException();
        }
        int prob = 0;
        String[] string2 = string.split("\t");


        char[] string3 = string.toCharArray();

        for (int i = 0; i < string3.length; i++){
            String s = String.valueOf(string3[i]);
            if (s.equals("\t")) prob++;
        }

        if (prob < 2) throw new TooShortStringException();
        String ret = string2[1];

        return ret;
    }

    public static class TooShortStringException extends Exception {
    }
    public static void main(String[] args) throws Exception{

        String string = getPartOfString(null);

        System.out.println(string);
    }

}
billybonce
подай на вход строку "\t\t" — у меня работает без ошибок, возвращая то ничего которое между ними.
у твоей версии вылетает ошибка ArrayIndexOutOfBounds.
Vadim625
  • Vadim625
  • 0
  • Комментарий отредактирован 2014-03-05 16:03:45 пользователем Vadim625
Большое спасибо
k1per
Да, и мне помог это комментарий. Спасибо!
pryshchepa_maksym
Ребята, что я упустил?

public static String getPartOfString(String string) throws TooShortStringException
    {
        if (string == null)
        {
            throw new TooShortStringException();
        }

        char[] chars = string.toCharArray();
        int countTab = 0;
        for (char ch : chars)
        {
            if (ch == '\t')
            {
                countTab++;
            }
        }
        String result;
        if (countTab < 2)
        {
            throw new TooShortStringException();
        } else
        {
            result = string.substring(string.indexOf("\t") + 1, string.lastIndexOf("\t"));
        }
        return result;
    }
billybonce
>между первой и второй табуляцией
pryshchepa_maksym
блин, спасибо, а у меня между первой и последней
phashik
  • phashik
  • 0
  • Комментарий отредактирован 2014-04-02 11:45:16 пользователем phashik
Один баг отловил, но что-то все равно осталось.
public static String getPartOfString(String string) throws TooShortStringException {
    try {
        if ((string+" ").split("\t").length < 3)
            throw new Exception();
        return string.split("\t")[1];
    } catch (Exception e) {
        throw new TooShortStringException();
    }
}
phashik
Переписал по-другому и прошло, но всё равно очень интересно, что не так с этим кодом.
LastLost
"\t\t" — тестил?
а это валидная строка…
phashik
  • phashik
  • 0
  • Комментарий отредактирован 2014-04-02 13:11:25 пользователем phashik
да, тестил. собственно, из-за этого теста появилось
string + " "

оказалось, что split может выделить пустую строку в начале и в середине, но не в конце. что логично, в общем-то :)
вообще вроде постарался кучу разных тестов попробовать.
LastLost
но чет у меня не прошло тест, код который выше, собственно почему и написал
phashik
  • phashik
  • 0
  • Комментарий отредактирован 2014-04-02 15:01:15 пользователем phashik
жуткое недоразумение: видимо, я таки не совсем на таком примере тестировал.
возможно, там было что-то вроде «12\t\t\t2 3\t21», и я думал, что это то же самое…
мне таааак стыдно сейчас :(
зато я узнал еще кое-что о работе метода split :)
Спасибо!
void
  • void
  • 0
что здесь не так?
public static String getPartOfString(String string) throws TooShortStringException
    {
        
          if (string == null) {
                throw new TooShortStringException();
            }

          char[] chars = string.toCharArray();
          int count = 0;
          for (char ch : chars) {
              if (ch == '\t') count++;
          }

          if (count < 2) {
              throw new TooShortStringException();
          } else {
              int i = string.indexOf("\t");
              int j = string.indexOf("\t", i + 1);
              return string.substring(i, j);
          }
    }
strEaM
Работает, но не принимает. проверял с "\t\t", подкиньте еще вариантом для теста. Что в моей задачи не так…
public class Solution {
    public static String getPartOfString(String string) throws TooShortStringException {
        String result="";
        try {
            String [] m =string.split("\t");
            if(m.length!=0) result = m[1] ;
        }
        catch (Exception e){
            throw new TooShortStringException();
        }
        return result;
    }
    public static class TooShortStringException extends Exception {
    }
}
blacky
Ну лично меня напрягает обработка следующего примера:
// result is TooShortStringException
System.out.println(getPartOfString("123\t\t"));
// check the m array
System.out.println(Arrays.asList(m));
System.out.println(m.length);

Тут split не особо годен, лучше что-то типа этого:
int openingTabIdx, closingTabIdx;
openingTabIdx = string.indexOf('\t');
closingTabIdx = string.indexOf('\t', openingTabIdx + 1);
// other code
strEaM
Спасибо за совет, задачу сдал
ttt
  • ttt
  • 0
Вроде бы идея правильная, но не получается
public static String getPartOfString(String string) {
        int openingTabIdx=0, closingTabIdx=0;
        try
        {
            if(string==null) throw new TooShortStringException();
            //if(string.length()<3) throw new TooShortStringException();
            openingTabIdx = string.indexOf('\t');
            closingTabIdx = string.indexOf('\t', openingTabIdx + 1);
            if(openingTabIdx<0||closingTabIdx<0)
                throw new TooShortStringException();
            return string.substring( openingTabIdx,closingTabIdx).trim();
        }catch (TooShortStringException e){
            e.printStackTrace();
        }
        return "";
    }
MindIbniM
посмотри на значение индексов табуляции по умолчанию и на условие проверки исключения, что будет, если, например табуляций в строке нет?
и в return'е глянь внимательно, что именно будет вырезаться (проверь на разных исходниках). И трим тут зачем?
4e4el
Уважаемые Джаварашовцы! Подскажите в чем затупил, почему не принимает?


    public static String getPartOfString(String string) throws TooShortStringException
    {
        int one = string.indexOf('\t');
        int two = string.indexOf('\t', one+1);

        if (string==null)
            throw new TooShortStringException();


        if (string.isEmpty())
            throw new TooShortStringException();


        int countTab = 0;
        for (char ch : string.toCharArray())
        {
            if (ch == '\t')
            {
                countTab++;
            }
        }
        String result;
        if (countTab < 2) throw new TooShortStringException();

            result = string.substring(one + 1, two);

        return result;
    }
    public static class TooShortStringException extends Exception {
    }
   

vps
передайте в метод null и посмотрите что будет…
4e4el
Спасибо вам, только на null я и не проверил :)
эх, и изза этой ошибки я просидел четыре часа…
Naissur
Вот это респект! 8 попыток впустую, сто раз проверял на всякие значения, результат верный. Не додумался проверить только на null. А когда сделал это, сразу понял, чего не хватает.
Sis
  • Sis
  • 0
Ох, все намного проще. Смотрим описание метода indexOf. Особенно его реализации с 2 параметрами.
Ну и не забываем чекать на null, -1, isEmpty и все будет просто.

ужал код в 2 строчки :) проверка и return :)
Dimich
Ради интереса тоже ужал свой код из 6 строк в 2 )) проверка и return )
Но когда читаешь эти две строчки больше вдумываешься, чем когда читаешь шесть строк, поэтому не всегда такое ужимание на пользу ИМХО)
zSvetik
Выбросите, пожалуйста, строки для тестирования. А то метод вроде и работает нормально, но сервис отказывается принимать.
public static String getPartOfString(String string) throws TooShortStringException {
        if (string.isEmpty() || string == null || string.indexOf('\t') < 0) {
            throw new TooShortStringException();
        }

        int firstTab = string.indexOf('\t'), secondTab = string.indexOf('\t', firstTab + 1);
        
        if (secondTab > 0) {
            return string.substring(firstTab + 1, secondTab);
        } else {
            throw new TooShortStringException();
        }
    }
zSvetik
Не актуально.
Не принимало из за лишней проверки (избыточность кода).
Helga
  • Helga
  • 0
  • Комментарий отредактирован 2015-02-13 15:33:33 пользователем Helga
Сорри)
ValerDDoS
  • ValerDDoS
  • 0
  • Комментарий отредактирован 2015-02-23 13:01:49 пользователем ValerDDoS
Хинты для застрявших ))
Решал с помощью регулярки. Приняло с первого раза.
1. null бросаем эксепшен.
2. длина меньше 2 бросаем эксепшен.
3. m.find() в цикле и определяем первый/второй таб. засекаем индекс начала, конца нужной подстроки.
4.Если двух табов не нашли бросаем эксепшен.
5. Если индекс начала, конца равен 0 возвращаем null.
Deni_K
Ублюдочная задача!!! Нужно максимально минимизировать код. Проверка на null и отсутствие табуляции то есть индекс равен -1 и все.
eniqen
  • eniqen
  • 0
  • Комментарий отредактирован 2015-06-10 15:43:58 пользователем eniqen
не принимает подскажет кто?

public class Solution {
    public static String getPartOfString(String string) throws TooShortStringException {
        String indexOne;
        String indexTwo;
        if (string == null | string.isEmpty()) {
                throw new TooShortStringException();
        } else {
            try{
                indexOne = string.substring(string.indexOf("\t"));
                indexTwo = indexOne.substring(indexOne.indexOf("\t"));
            } catch (Exception e){
                throw new TooShortStringException();
            }
        }
        return indexTwo.trim();
    }

    public static class TooShortStringException extends Exception {
    }
}


вариант 2

public class Solution {
    public static String getPartOfString(String string) throws TooShortStringException {
        char[] o = string.toCharArray();
        int count = 0;
        if (string == null | string.isEmpty()) {
                throw new TooShortStringException();
        } else {
            for (int i = 0; i < o.length; i++) {
                if (o[i] == '\t') {
                    count++;
                    if (count == 2) {
                        count = i;
                        break;
                    }
                }
            }
            if(count < 2) {
                throw new TooShortStringException();
            }
        }
        return string.substring(string.indexOf("\t"), count).trim();
    }

    public static class TooShortStringException extends Exception {
    }
}
eniqen
у этой задачи кривые тесты если в одном ифе сделать много проверок задача не принимается если раскидать по разным тогда примет. Имейте ввиду
Naissur
У меня
if ((firstTabIndex == -1) || (secondTabIndex == -1))

прокатило. Проверка на null, правда, в другом if'е.
aleratorio
  • aleratorio
  • +1
  • Комментарий отредактирован 2015-07-10 03:14:02 пользователем aleratorio
Не надо никаких проверок, ни на null, ни на tab-ы, ни на длину строки, вообще никаких. Заключаем получение подстроки в try, ловим Exception, выбрасываем своё. При null, и с некорректной строкой и так словим исключение.
diagel
Да согласен, я сразу так сделал в пару строк, но меня напугало необработанное исключение в кэтче и я полез в дебри if ;) но в итоге решил, что это говно мало того что не принимается, так ещё выглядит убого и вернулся к старому решению :))) с 4 попытки!
warks
  • warks
  • 0
  • Комментарий отредактирован 2016-02-10 12:00:45 пользователем warks
public static String getPartOfString(String string) throws TooShortStringException {
        int start = string.indexOf("\t");
        int end = string.indexOf("\t", start+1);
        try {        return string.substring(start,end).trim(); }
        catch (Exception e) {
            throw new TooShortStringException();
        }
    }


Объясните плиз, где я не прав.
warks
Разобрался
sergey34
Все работает, что не то:
public class Solution {
    public static String getPartOfString(String string) throws TooShortStringException {
        if (string==null){
            throw new TooShortStringException();
        }
        else{
            try{
            String j = null;
            j = string.substring(string.indexOf("\t"), string.indexOf("\t", string.indexOf("\t") + 1));
            return j.trim();
            }
            catch(Exception e){
                throw new TooShortStringException();
            }
        }
    }

    public static class TooShortStringException extends Exception {
    }

    public static void main(String[] args) throws TooShortStringException {
        System.out.println(getPartOfString("tab0\ttab\ttab1\t"));       //tab
        System.out.println(getPartOfString("\t\t"));                    //
        System.out.println(getPartOfString("123\t123"));                //Exception
        System.out.println(getPartOfString(null));                      //Exception
    }
}
Docktor91
«tab0\t tab\ttab1\t»
sergey34
Почему? .trim по возврату обрезает пробелы в начале и в конце
Docktor91
  • Docktor91
  • 0
  • Комментарий отредактирован 2016-05-13 17:59:21 пользователем Docktor91
а кто сказал что их нужно обрезать?
и ксатати у вас возвращается строка не между, а "\tподстрока".trim()
sergey34
Как обычно переписал заново и все прошло, с использованием trim по возврату, спасибо
pandaFromMinsk
Совершенно непонятно, зачем нужно было тратить время и совершать кучу напрасных попыток, выискивая как правильно написать код?
Разве недостаточно было вставить проверку, что если позиция второго таба = -1, тогда выбрасывать еррор?

Или вариант, который засчитал валидатор — более производительный?
Maks
  • Maks
  • 0
Что не так?!
public class Solution {
    public static String getPartOfString(String string) throws TooShortStringException
    {
        if(string == null) throw new TooShortStringException();
        
        int first_index = string.indexOf("\t");
        if(first_index == -1) throw new TooShortStringException();

        int second_index = string.indexOf("\t",first_index+1);
        if(first_index == -1) throw new TooShortStringException();

        string = string.substring(first_index+1,second_index);
        return string;
    }

    public static class TooShortStringException extends Exception {
    }

    public static void main(String[] args) throws TooShortStringException {
        System.out.println(getPartOfString("\ttab0\ttab\ttab1\t"));       //tab
        System.out.println(getPartOfString("\t\t"));                    //
        System.out.println(getPartOfString("123\t123"));                //Exception
        System.out.println(getPartOfString(null));                      //Exception
    }
}
Padre
Не нужно делать проверку на условия через if. Просто делаешь реализацию механизма обрезания строки внутри try-catch. В мейне уже даны кривые строки, которые по-любому вызовут ошибку, если алгоритм обрезания правильный.
У меня получилось одна строка — объявление переменной. Две строки внутри try (собственно, обрезание табов), проброс исключения в catch и return. Нечего там городить с if…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.