манипуляции с Java-строками - PullRequest
0 голосов
/ 18 марта 2011

Хорошо, поэтому я попытался с вашей помощью узнать немного больше о строках и цепочках строк в Java.

теперь я знаю, что строки неизменны, но мне очень трудно это сделать, например:

Реализация метода

public static String notReplace(String str)

Метод принимает строку в качестве входных данных и возвращает строку, в которой каждое вхождение строчной буквы «есть» было заменено на «нет».Слову «is» не должно предшествовать сразу 2 или после него буква - поэтому, например, «is» в «this» не следует заменять.(Примечание: Character.isLetter(char) проверяет, является ли символ буквой.)

Примеры:
notReplace ("is test") → "is not test"
notReplace («это мудро») → «нет, не мудро»

Вот что я написал:

public class NotReplace{

    public static void main(final String[] args){
        final String str2 = "is no";
        System.out.println(notReplace(str2));

    }

    public static String notReplace(final String str){
        final int times = str.length();

        final StringBuilder sb = new StringBuilder(str);
        for(int i = 0; i <= times; i++){
            if((str.charAt(i) == 'i') && (str.charAt(i + 1) == 's')
                && !Character.isLetter(str.charAt(i + 2))){
                sb.insert(i, "not");

            }
            final String str1 = sb.toString();
            return str1;

        }
    }
}

Я считаю, что это полный беспорядок, я 'Я буду рад узнать больше о том, как работать со строками в подобных ситуациях.

Спасибо

Редактировать: я не могу использовать функцию replaceAll.

Ответы [ 7 ]

3 голосов
/ 18 марта 2011

На вашем месте я бы выбрал следующий подход.

Первый шаг: придумайте столько «любопытных» строк, сколько сможете: null, "", "i", "x", "is", "his", "ist", "list", "is it", "it is", "what is it", "what it is" и т. Д.

Второй шаг: написать метод main(), который передает все эти значения в метод notReplace() и отображает результат. Метод notReplace() должен просто вернуть параметр в этой точке.

public static String notReplace(final String str){
  return str;
}

Третий шаг. Скомпилируйте и протестируйте его. Это важный. Не пишите большие куски кода сразу. Напиши немного, перекомпилируй и проверь, все ли еще работает. Звучит медленно, но это гораздо быстрее, чем копаться в течение нескольких часов, пытаясь найти несоответствующую фигурную скобку в 200 строках кода. Отныне, между каждым шагом вы должны повторять это.

Четвертый шаг: измените notReplace(), чтобы он нашел подстроку "is". Не изменяйте вывод, просто сделайте System.out.println( "Is found.");.

Пятый шаг: расширить его еще больше, определив, является ли предыдущий и следующий символ (если есть) буквой или нет.

Шестой шаг: вставьте «нет» после того, как вы нашли «есть».

Если вы выполните эти шаги, вы сможете постепенно построить свою программу и, поскольку вы изменяете только пару строк между двумя тестами, любые ошибки будут легко обнаружены.

3 голосов
/ 18 марта 2011

Вы можете найти это интересным

String text = "This is a test. It is"; // note the 'is' at the end.
String text2 = text.replaceAll("\\bis\\b", "is not");
System.out.println(text +" => "+text2);

печать

This is a test. It is => This is not a test. It is not

Следующий метод делает это длинным путем

 public static String notReplace(final String str){
    final StringBuilder sb = new StringBuilder()
                                 .append(' ').append(str).append(" ");
    for (int i = 0; i < sb.length() - 2; i++) {
        if (!Character.isLetter(sb.charAt(i)) &&
                sb.charAt(i + 1) == 'i' &&
                sb.charAt(i + 2) == 's' &&
                !Character.isLetter(sb.charAt(i + 3))) {
            sb.insert(i + 3, " not");
            i += 5;
        }
    }
    return sb.substring(1, sb.length() - 1);
}

Пробелы добавляются в начало и конец, чтобы избежать проверки границ.

0 голосов
/ 21 марта 2019
public String notReplace(String str) {
String a  = "";
int i = 0;
if(str.length()<2)
  {return "";}
else if(str.length()==2 && (!(str.substring(0).equals("is"))))
  {return "";}
else if(str.length()==2)
{return "is "+"not";}
while(i<str.length()){
if(i==0&& str.substring(0,2).equals("is")&&Character.isLetter(str.charAt(2))==false)
{a+= str.substring(0,2)+" not";
i+=2;}
else if(i>1&&i<str.length()-2&&str.substring(i,i+2).equals("is")&&Character.isLetter(str.charAt(i-1))==false&&Character.isLetter(str.charAt(i+2))==false)
{a+= str.substring(i,i+2)+" not";i+=2;}
else if(i == str.length()-2 && str.substring(str.length()-2).equals("is")&&Character.isLetter(str.charAt(str.length()-3))==false)
{a+=str.substring(str.length()-2)+ " not";break;}
else
{a+= str.charAt(i);
i+=1;}
}
return a;
}

это может показаться сложным, но я понял это с первой попытки.

0 голосов
/ 18 февраля 2015

public String notReplace(String str) {
  String outputStr = "";
  int index = 0;
  int lastSeen = 0;

  if (str == "is")
    return "is not";

  for (int i = 0; i < str.length() - 2; i++) {
    index = str.indexOf("is", lastSeen);
    if (index == -1)
      break;

    if (index == 0 && !Character.isLetter(str.charAt(index + 2))) {
      outputStr = outputStr + str.substring(lastSeen, index);
      outputStr = outputStr + "is not";
      lastSeen = index + 2;
    } else if (index > 0 && index < str.length() - 2 && str.charAt(index + 2) == ' ' && str.charAt(index - 1) == ' ') {
      outputStr = outputStr + str.substring(lastSeen, index);
      outputStr = outputStr + "is not";
      lastSeen = index + 2;
    } else if (index == (str.length() - 2) && !Character.isLetter(str.charAt(index - 1))) {
      outputStr = outputStr + str.substring(lastSeen, index);
      outputStr = outputStr + "is not";
      lastSeen = index + 2;
    } else {
      if (lastSeen < str.length()) {
        outputStr = outputStr + str.substring(lastSeen, index);
        outputStr = outputStr + "is";
      }
      lastSeen = index + 2;
    }

  }
  if (lastSeen < str.length())
    outputStr = outputStr + str.substring(lastSeen);
  return outputStr;
}
}
0 голосов
/ 19 марта 2011

Мне нравится рекурсивный:

public static String notReplace(String str) {

    StringBuilder buffer = new StringBuilder();
    notReplace(str, buffer);
    return buffer.toString();
}


public static void notReplace(String str, StringBuilder buffer) {
    if(str.length() < 3) {
        buffer.append(str).toString();
    }
    else if ( str.startsWith("is ") ) {
        notReplace(str.substring(3), buffer.append("is not "));         
    }
    else {
        notReplace(str.substring(1), buffer.append(str.charAt(0))); 
    }
}
0 голосов
/ 18 марта 2011
String text = "This is a test";
String text2 = text.replaceAll(" is ", "is not");
System.out.println(text2);
0 голосов
/ 18 марта 2011
  1. Проблема в sb.insert (i, "not"); должно быть sb.insert (i + 1, "not");
  2. Я думаю, что регулярное выражение является решением в таком случае.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...