Java String ReplaceFirst

Я читаю строку

Is Mississippi a State where there are many systems.

Я хотел бы заменить 1-ю "s" или "S" в каждом слове "t" или "T" (т.е. сохранить один и тот же случай)... так что на выходе будет:

It Mitsissippi a Ttate where there are many tystems.

Я пробовал

s= s.replaceFirst("(?i)S", "t"); [which of course didn't work]

и попытались разбить строку, используя string [] .split(Pattern.quote("\\s")), а затем попытаться выяснить, как replaceFirst() каждый элемент array, а затем вернуть значения обратно в string [, но не смог правильный способ сделать это].

Я думал, что \\G может помочь перезагрузить на следующее слово, но не получил. Любая помощь, использующая эти 3 метода, оценивается.

Ответы

Ответ 1

Подход-1: Без использования методов replace и split для повышения производительности.

String str = "Is Mississippi a State where there are many systems.";
System.out.println(str);

char[] cArray = str.toCharArray();
boolean isFirstS = true;
for (int i = 0; i < cArray.length; i++) {
    if ((cArray[i] == 's' || cArray[i] == 'S') && isFirstS) {
        cArray[i] = (cArray[i] == 's' ? 't' : 'T');
        isFirstS = false;
    } else if (Character.isWhitespace(cArray[i])) {
        isFirstS = true;
    }
}
str = new String(cArray);

System.out.println(str);

EDIT: Approach2: Как вам нужно использовать метод replaceFirst, и вы не хотите использовать StringBuilder, вот вам вариант:

String input = "Is Mississippi a State where there are many Systems.";
String[] parts = input.split(" ");
String output = "";

 for (int i = 0; i < parts.length; ++i) {
     int smallSIndx = parts[i].indexOf("s");
     int capSIndx = parts[i].indexOf("S");

     if (smallSIndx != -1 && (capSIndx == -1 || smallSIndx < capSIndx))
         output += parts[i].replaceFirst("s", "t") + " ";
     else
         output += parts[i].replaceFirst("S", "T") + " ";
 }

System.out.println(output); //It Mitsissippi a Ttate where there are many Tystems. 

Примечание. Я предпочитаю подход 1, потому что у него нет накладных расходов для метода replaceFisrt и split, String append или concat

Ответ 2

Один вариант состоит в том, чтобы разделить строку на слова, а затем использовать String.replaceFirst() для каждого слова, чтобы заменить первое вхождение s на t (или любую другую нужную букву):

Update:

Я реорганизовал свое решение, чтобы найти первое вхождение любого s (верхнего или нижнего регистра) и применить к нему соответствующее преобразование.

String input = "Is Mississippi a State where there are many systems.";
String[] parts = input.split(" ");
StringBuilder sb = new StringBuilder("");

for (int i=0; i < parts.length; ++i) {
    if (i > 0) {
        sb.append(" ");
    }
    int index = parts[i].toLowerCase().indexOf('s');
    if (index >= 0 && parts[i].charAt(index) == 's') {
        sb.append(parts[i].replaceFirst("s", "t"));
    }
    else {
        sb.append(parts[i].replaceFirst("S", "T"));
    }
}

System.out.println(sb.toString());

Вывод:

It Mitsissippi a Ttate where there are many tystems.

Ответ 3

Используйте нижеследующую поправку к ответу Тима Бигелейсена (до редактирования его сообщения)

String input = "Is Mississippi a State where there are many systems.";
String[] parts = input.split(" ");
StringBuilder sb = new StringBuilder("");

for (String part : parts) {
    sb.append(part.replaceFirst("s", "t").replaceFirst("S", "T"));
    sb.append(" ");
}

System.out.println(sb.toString());

Изменить - вы можете использовать concat()

String input = "Is Mississippi a State where there are many systems.";
String[] parts = input.split(" ");

String output = "";

for (String part : parts) {
    output = output.concat(part.replaceFirst("s", "t").replaceFirst("S", "T") + " ");
}

    System.out.println(output);

Обновление

    String input = "Is Mississippi a State where there are many Systems.";
    String[] parts = input.split(" ");
    //StringBuilder sb = new StringBuilder("");

    String output = "";

    for (String part : parts) {
        output = output.concat(part.replaceFirst("s", "t") + " ");
    }

    String[] parts2 = output.split(" ");

    output = "";

    for (String part : parts2) {
        output = output.concat(part.replaceFirst("S", "T") + " ");
    }
    System.out.println(output);

Ответ 4

Я создал метод, который -

  • является общим назначением,
  • не использует replace или split, а
  • использует только один цикл.

Ниже приведен фрагмент кода:

public static String replaceFirstOccurance(String sentence, char toChange, char changeWith) {
    StringBuilder temp = new StringBuilder();

    boolean changed = false;
    for (int i = 0; i < sentence.length(); i++) {
        if (!changed) {
            if (sentence.charAt(i) == toChange) {
                temp.append(changeWith);
                changed = true;
            } else if (sentence.charAt(i) == Character.toUpperCase(toChange)) {
                temp.append(Character.toUpperCase(changeWith));
                changed = true;
            } else {
                temp.append(sentence.charAt(i));
            }
        } else {
            if (sentence.charAt(i) == ' ') {
                changed = false;
            }
            temp.append(sentence.charAt(i));
        }
    }

    return temp.toString();
}

Ответ 5

Мой метод будет в меньшей степени зависеть от тех строковых методов, о которых вы упомянули.

String phrase;
String [] parts = phrase.split(" ");

for (int i = 0; i < parts.length; i++ ) {
    for (int j = 0; j < parts[i].length(); j++) {
        if (parts[i].charAt(j) == 's') {
            parts[i] = "t" + parts[i].substring(1);
            break;
        } else if (parts[i].charAt(0) == 'S') {
            parts[i] = "T" + parts[i].substring(1);
            break;
        }
    }
}

String modifiedPhrase = "";

for (int i = 0; i < parts.length; i++ ) {
    modifiedPhrase += parts[i] + " ";
}

Ответ 6

Для этого есть приятное, компактное, потоковое решение:

String result = Stream.of(s.split(" "))
    .map(t -> t.replaceFirst("s", "t"))
    .map(t -> t.replaceFirst("S", "T"))
    .collect(Collectors.joining(" "));

Ответ 7

String ss = "Is Mississippi a State where there are many systems.";

String out = "";//replaced string
for (String s : ss.split(" ")) {
    int index = s.toUpperCase().indexOf('S');
    out += (s.replaceFirst("[s,S]", index!= -1 && s.charAt(index) == 'S' 
               ? "T" : "t")) + " ";
}

System.out.println(out);