2014-09-15 11 views
-1

Im практикует рекурсию для собственного развлечения с помощью упражнений codingBat. Я делаю это упражнение:Разница между equals() и startsWith() в java

Учитывая строку, вычислить рекурсивно количество строк в нижнем регистре «hi», однако не считайте «hi», у которых есть «x» непосредственно перед ними.

countHi2("ahixhi") → 1 
countHi2("ahibhi") → 2 
countHi2("xhixhi") → 0 

Я попытался сделать этот код, но он продолжать бросать из ограничивающей исключения:

public int countHi2(String str){  
    if(str.length()<2){ 
     return 0; 
    } 
    else if(str.substring(0,3).equals("xhi")){ 
     return countHi2(str.substring(3)); 
    } 
    else if(str.substring(0,2).equals("hi")){ 
     return 1+countHi2(str.substring(2)); 
    } 
    else{ 
     return countHi2(str.substring(1)); 
    } 
} 

Я изменил подстроку() и равна StartsWith()

else if(str.startsWith("xhi")){ 
      return countHi2(str.substring(3)); 

И теперь работает отлично, может кто-нибудь указать, почему мой первый код не был правильным? Есть ли разница между startsWith() и equals()?

+8

Ваше имя начинается с '' пользователя ''? Является ли он равным '' notuser''? –

+1

Перед выполнением подстроки (0, 3) вы должны убедиться, что строка имеет не менее 3 символов. Это то, что начинается с хорошим, и что ваш код этого не делает. Если вы прочитали трассировку стека исключения, вы бы заметили, что исключение не было выбрано equals(), а подстрокой(). Трассировка стека исключений также указывает вам, в какой строке кода генерируется исключение. Не считая трассировку стека, это ваша самая большая ошибка. –

+0

Я просто спрошу, так как вы не указали, что вам нужно использовать 'equals или startsWith' или что-то вроде' contains' valid также потому, что я бы сказал, что содержимое будет немного проще и надежнее для других примеров строк; эта реализация, похоже, предполагает, что тестовая строка всегда находится в шаблоне * hi * hi и т. д. – Culyx

ответ

6

Сначала вы убедитесь, что в строке есть не менее двух символов, тогда вы проверяете, есть ли первые три символов: xhi. String.substr выдает исключение, если строка недостаточно длинная.

String.startsWith не имеет этой проблемы, это не вызывает исключения, когда вы проверяете, начинается ли 2 символьная строка с 3 символами - она ​​просто возвращает false.