Java - Добавить номера к соответствующим словам

1

Я пытаюсь добавить число счетчиков для совпадения слов, например:

Слово соответствия: "Текст"

Вход: Текст Текст Текст TextText ExampleText

Вывод: Text1 Text2 Text3 Text4Text5 ExampleText6

Я пробовал это:

String text = "Text Text Text TextText ExampleText";
String match = "Text";
int i = 0;
while(text.indexOf(match)!=-1) {
text = text.replaceFirst(match, match + i++);
}

Не работает, потому что он будет циклически навсегда, матч останется в строке, а IndexOf никогда не остановится.

Что бы вы мне посоветовали? Есть ли лучший способ сделать это?

  • 0
    Попробуйте использовать две строки: одну для исходных данных и одну для измененных. Возможные улучшения: используйте StringBuilder, используйте выражения регулярных выражений.
  • 0
    создайте вторую строку, в которой вы пишете части, которые вы уже «скорректировали». Затем удалите его из исходной строки, так что while indexof в конечном итоге вернет -1
Показать ещё 1 комментарий
Теги:

7 ответов

2
Лучший ответ

Вот один с StringBuilder но не нужно разделять:

public static String replaceWithNumbers( String text, String match ) {
    int matchLength = match.length();
    StringBuilder sb = new StringBuilder( text );

    int index = 0;
    int i = 1;
    while ( ( index = sb.indexOf( match, index )) != -1 ) {
        String iStr = String.valueOf(i++);
        sb.insert( index + matchLength, iStr );

        // Continue searching from the end of the inserted text
        index += matchLength + iStr.length();
    }

    return sb.toString();
}
  • 0
    Здорово. Похоже, мое решение. ;-)
  • 0
    @SubOptimal Может быть. Я проверял это прежде, чем я отправил, Вы, возможно, отправили ранее. Кстати, вы проверяли свой код, когда строка для сопоставления является цифрой?
Показать ещё 1 комментарий
2

сначала возьмите один stringbuffer, т.е. результат, затем пролили источник на матч (место назначения). В результате получается массив пробелов и оставшихся слов, кроме "Текст". затем проверьте условие на отсутствие и в зависимости от того, что заменит позицию массива.

String text = "Text Text Text TextText ExampleText";
    String match = "Text";
    StringBuffer result = new StringBuffer();
    String[] split = text.split(match);
    for(int i=0;i<split.length;){
        if(split[i].isEmpty())
            result.append(match+ ++i);
        else
            result.append(split[i]+match+ ++i);
    }
    System.out.println("Result is =>"+result);

O/P Результат => Text1 Text2 Text3 Text4Text5 ExampleText6

1

Одним из возможных решений может быть

String text = "Text Text Text TextText ExampleText";
String match = "Text";
StringBuilder sb = new StringBuilder(text);
int occurence = 1;
int offset = 0;
while ((offset = sb.indexOf(match, offset)) != -1) {
    // fixed this after comment from @RealSkeptic
    String insertOccurence = Integer.toString(occurence);
    sb.insert(offset + match.length(), insertOccurence);
    offset += match.length() + insertOccurence.length();
    occurence++;
}
System.out.println("result: " + sb.toString());
1

Попробуйте это решение.

    String text = "Text Text Text TextText Example";
    String match = "Text";
    String lastWord=text.substring(text.length() -match.length());

    boolean lastChar=(lastWord.equals(match));

    String[] splitter=text.split(match);
    StringBuilder sb = new StringBuilder();
    for(int i=0;i<splitter.length;i++)
    {

       if(i!=splitter.length-1)
           splitter[i]=splitter[i]+match+Integer.toString(i);
       else
          splitter[i]=(lastChar)?splitter[i]+match+Integer.toString(i):splitter[i];

       sb.append(splitter[i]);
       if (i != splitter.length - 1) {
           sb.append("");
       }
    }
    String joined = sb.toString();
    System.out.print(joined+"\n");
  • 0
    На самом деле это хорошее решение .. +1 :)
  • 0
    Thnx;) TheLostMind
Показать ещё 4 комментария
0

Мы можем решить это, используя stringbuilder, он предоставляет простейшую конструкцию для вставки символа в строку. Ниже приведен код

    String text = "Text Text Text TextText ExampleText";
    String match = "Text";
    StringBuilder sb = new StringBuilder(text);
    int beginIndex = 0, i =0;
    int matchLength = match.length();
    while((beginIndex = sb.indexOf(match, beginIndex))!=-1) {
         i++;
         sb.insert(beginIndex+matchLength, i);
         beginIndex++;
    }
    System.out.println(sb.toString());
0

Это будет работать для вас:

public static void main(String[] args) {
    String s = "Text Text Text TextText ExampleText";
    int count=0;
    while(s.contains("Text")){
        s=s.replaceFirst("Text", "*"+ ++count); // replace each occurrence of "Text" with some place holder which is not in your main String.
    }
    s=s.replace("*","Text");
    System.out.println(s);


}

O/P:

Text1 Text2 Text3 Text4Text5 ExampleText6
  • 2
    Что если в тексте будет *? Вы должны использовать другой знак, например, символ Белла или что-то в этом роде.
  • 0
    @Milkmaid - я редактировал свой ответ .. Вы должны выбрать что-то, чего нет в строке
Показать ещё 1 комментарий
0

Я реорганизовал код @DeveloperH на это:

public class Snippet {

    public static void main(String[] args) {
        String matchWord = "Text";
        String input = "Text Text Text TextText ExampleText";
        String output = addNumbersToMatchingWords(matchWord, input);
        System.out.print(output);
    }

    private static String addNumbersToMatchingWords(String matchWord, String input) {
        String[] inputsParts = input.split(matchWord);

        StringBuilder outputBuilder = new StringBuilder();
        int i = 0;
        for (String inputPart : inputsParts) {
            outputBuilder.append(inputPart);
            outputBuilder.append(matchWord);
            outputBuilder.append(i);
            if (i != inputsParts.length - 1)
                outputBuilder.append(" ");
            i++;
        }
        return outputBuilder.toString();
    }
}
  • 0
    Хорошо сделано. Я редактирую свой ответ. пожалуйста, проверьте мой ответ и отредактируйте его

Ещё вопросы

Сообщество Overcoder
Наверх
Меню