Я решил проблему, указанную ниже, она отлично работает, но кажется громоздкой и не очень эффективной. Я ищу способы улучшить его и получить более элегантное решение, любые предложения, как я могу его улучшить? Любые советы оценили. Спасибо!Элегантное решение для пользовательской замены java string
Задача: Приведенная строка возвращает строку, в которой каждый вид строчного слова «есть» заменен на «нет». Слово «есть» не должно предшествовать или сопровождаться буквой - так, например, «is» в «this» не учитывается.
Тесты:
notReplace("is test") → "is not test"
notReplace("is-is") → "is not-is not"
notReplace("This is right") → "This is not right"
notReplace("This is isabell") → "This is not isabell"
notReplace("")→ ""
notReplace("is") → "is not"
notReplace("isis") → "isis"
notReplace("Dis is bliss is") → "Dis is not bliss is not"
notReplace("is his") → "is not his"
notReplace("xis yis") → "xis yis"
notReplace("AAAis is") → "AAAis is not"
Мое решение:
public static String notReplace(String str) {
String result="";
int begin = 0;
if (str.equals("is"))
return "is not";
int index = str.indexOf("is");
if (index==-1)
return str;
while (index>-1){
if (index+begin==0 && !Character.isLetter(str.charAt(index+2))){
result += "is not";
begin = index+2;
index = str.substring(begin).indexOf("is");
}
else if (index+begin==0 && Character.isLetter(str.charAt(index+2))){
result += str.substring(begin,begin+index)+"is";
begin += index+2;
index = str.substring(begin).indexOf("is");
}
else if (index+begin == str.length()-2 && !Character.isLetter(str.charAt(index+begin-1))){
result += str.substring(begin, begin+index)+"is not";
return result;
}
else if(!Character.isLetter(str.charAt(index+begin-1))&&!Character.isLetter(str.charAt(index+begin+2))){
result += str.substring(begin,begin+index)+"is not";
begin += index+2;
index = str.substring(begin).indexOf("is");
}
else {
result += str.substring(begin,begin+index)+"is";
begin += index+2;
index = str.substring(begin).indexOf("is");
}
}
result += str.substring(begin);
return result;
}
Вы можете прочитать о так называемых «регулярных выражений». Они обычно используются для соответствия и замены ввода на основе определенных условий. –
Спасибо за совет @still_learning, я обязательно перепишу свое решение с помощью регулярного выражения, неудивительно, если есть одно линейное решение, у меня просто не было много опыта использования их. –
Я был бы признателен за решения, которые работают для всех упомянутых тестовых примеров, а не только для некоторых из них, иначе предлагаемое решение не является вариантом. Благодаря! –