Как обрабатывать регистрозависимую замену строк без использования Regex в Java - PullRequest
3 голосов
/ 05 февраля 2012

Это проблема с сайта CodingBat. Сначала я вставляю проблему и после этого обсуждаю свои усилия:

Если заданы две строки, base и remove, вернуть версию базовой строки, в которой были удалены все экземпляры строки удаления (без учета регистра). Вы можете предположить, что строка удаления имеет длину 1 или более. Удалите только неперекрывающиеся экземпляры, поэтому при удалении «xxx» «xx» оставляет «x».

withoutString("Hello there", "llo") → "He there"
withoutString("Hello there", "e") → "Hllo thr"
withoutString("Hello there", "x") → "Hello there"

Это то, что я написал до сих пор:

public String withoutString(String base, String remove) {

   int len_b=base.length();
   int len_r = remove.length();
   String result="";

   if(len_b<1 || len_r<1)
   return "";

   for (int i =0;i<=len_b-len_r;i++)
   {
      if(base.substring(i,i+len_r).equals(remove))
      {
        i=i+len_r-1;
      }

      else
      { 
        result=result+base.substring(i,i+1);
      }  
   } 

   if(!(base.substring(len_b-len_r+1, len_b).equals(remove)))
   result=result+base.substring(len_b-len_r+1, len_b);

return result;
}

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

Например: withoutString("This is a FISH", "IS") → "Th a FH"

Мой код дает мне «Это FH», так как я не обработал чувствительность к регистру в моем коде. Я знаю, что с помощью Regex это можно сделать в одну строку. Мне больше интересно узнать, есть ли способ обработки подобных тестов в моем нынешнем коде. Также, пожалуйста, дайте мне знать, можно ли сделать мой код более эффективным / элегантным.

Ответы [ 5 ]

6 голосов
/ 05 февраля 2012

Строка имеет метод equalsIgnoreCase(String s).

1 голос
/ 05 февраля 2012

Вы можете изменить это утверждение base.substring(i,i+len_r).equals(remove) на base.substring(i,i+len_r).equalsIgnoreCase(remove), используя метод equalsIgnoreCase.

надеюсь, что полезно.

0 голосов
/ 19 мая 2015
public String withoutString(String base, String remove) {
      String b=base.toLowerCase();
      String r=remove.toLowerCase();
      if(b.length()<r.length()) return base;
      if(b.contains(r)) b=b.replaceAll(r,"");
      String temp="";
      int j=0;
      for(int i=0;i<base.length();i++)
        if(j<b.length()){
          if(base.substring(i,i+1).equalsIgnoreCase(b.substring(j,j+1))){
            temp+=base.substring(i,i+1);
            j++;
          }
        }  
      return temp;
    }
0 голосов
/ 04 декабря 2013

Я сделал это без зацикливания :) Полагаю, это не самый лучший ответ, но он работает, хотя

public String withoutString(String base, String remove) {
    String lastString = base.replace(remove, "");
    remove = remove.toLowerCase();
    String veryLastString = lastString.replace(remove, "");
    remove = remove.toUpperCase();
    String veryVeryLastString = veryLastString.replace(remove, "");
    return veryVeryLastString;
}
0 голосов
/ 19 мая 2013
public String withoutString(String base, String remove) 
{
    String str=base;
    String str1=remove;
    String str3=str;

    int k=str1.length();

    for(int i=0;i<(str.length()-k+1);i++)
    {
        if(str1.equalsIgnoreCase(str.substring(i, i+k)))
        {
            String str4=str.substring(i, i+k);
            str3=str3.replaceFirst(str4,"" );

        }
    }
    return str3;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...