Как разрешить моему коду проверять строки длиной 0? - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь удалить букву x, если она присутствует в качестве первого или последнего символа любой заданной строки.Почему мой код не проверяет строки с длиной 0, хотя я учел это в своем коде?

Я уже пытался использовать оператор if, чтобы проверить, равна ли длина 0, и, если да, вернутьоригинальная строка.Я также попытался вернуть пустую строку с тем же значением.

public String withoutX(String str) {
  if (((str.charAt(0)=='x') || str.charAt(str.length()-1) == 'x') && str.length()>=2){
    if (str.charAt(0)=='x'){
        str = str.substring(1,str.length());
    } if (str.charAt(str.length()-1) == 'x'){
        str = str.substring(0,str.length()-1);
    }
  } if (str.length()==1 && str == "x"){
      return "";
  } if (str.length()==0){
      return str;
    // the above if statement (length = 0) does not work
  } else{
      return str;
  }
}

Ожидаемый результат для него, чтобы вернуть строку без буквы х.Это было достигнуто для всех строк, кроме пустой, где говорится, что индекс находится вне диапазона.

Ответы [ 6 ]

0 голосов
/ 23 декабря 2018

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

if (str.length()==0){
      return str;
    // the above if statement (length = 0) does not work
  }

на первую строку метода.Кроме того, ваш код великолепен.

0 голосов
/ 23 декабря 2018

Более простой подход без проверки многих угловых случаев состоит в использовании регулярного выражения для удаления ведущего и следа x - если он существует.Вот код:

public String withoutX(String str){
    return "".equals(str)? str: str.replaceAll("(^x|x$)", "");
}
0 голосов
/ 23 декабря 2018

Я думаю, что это лучшая реализация того, что вы пытаетесь сделать

public String withoutX(String str) {

      if (str.startsWith("x")){ 
        str = str.replaceFirst("x", "");
      } 

      if (str.endsWith("x")){
        str = str.substring(0,str.lastIndexOf("x"));
      }

      return str;
}
0 голосов
/ 23 декабря 2018
public String withoutX(String str) {
  if (!str.isEmpty() && str.charAt(0)=='x'){
    str = str.substring(1, str.length());
  } 

  if (!str.isEmpty() && str.charAt(str.length()-1) == 'x'){
    str = str.substring(0,str.length()-1);
  }

  return str;
}

Вы можете сначала проверить, пуста ли строка, и удалить первый x.Затем проверьте размер больше 1 и удалите последний х.Это приводит к тому, что код становится все менее читаемым.

0 голосов
/ 23 декабря 2018

В этой строке:

if (((str.charAt(0)=='x') || str.charAt(str.length()-1) == 'x') && str.length()>=2)

вы проверяете длину строки, но после вы проверяете индексы.Измените на:

if (str.length()>=2 && (str.charAt(0)=='x' || str.charAt(str.length()-1) == 'x'))

, если str.length()>=2 равно false, другие условия не будут проверяться из-за оценки короткого замыкания.Также используйте equals() для сравнения строк, а не ==.Я бы написал ваш метод так:

public String withoutX(String str) {
    if (str.length() == 0 || (str.length() == 1 && str.equals("x")))
        return "";

    if (str.charAt(0) == 'x') {
        str = str.substring(1, str.length());
    }
    if (str.charAt(str.length() - 1) == 'x') {
        str = str.substring(0, str.length() - 1);
    }
    return str;
}

Я сохранил вашу логику и удалил ненужный код.

0 голосов
/ 23 декабря 2018
if (str.length() == 0) {
    return str;
}

Это должно быть в верхней части тела метода.Или, по крайней мере, он должен пройти до получения str.charAt(0).

  1. Есть String#isEmpty.
  2. То, как вы сравнили String s, неверно. Используйте equals вместо ==.
  3. Всегда проверяйте длину перед тем, как получит доступ к букве по индексу.Убедитесь, что индекс в строке существует.
...