2016-03-31 4 views
15

ich in einem String leseJava String replaceFirst

Is Mississippi a State where there are many systems. 

Ich möchte die erste „s“ oder „S“ mit „t“ in jedem Wort ersetzen oder „T“ (dh den gleichen Fall halten) ... so dass der Ausgang ist:

It Mitsissippi a Ttate where there are many tystems. 

I

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

und haben experimentiert TRYI versucht haben, ng die Zeichenfolge mit einem string [] spalten .split(Pattern.quote("\\s")) dann zu versuchen, herauszufinden, wie man replaceFirst() jedes Element der array und dann Rückkehr die Werte zurück zu einem string [aber herausfinden konnte, nicht den richtigen Weg, es zu tun].

Ich dachte, \\G könnte helfen, Neustart auf das nächste Wort, aber habe keine wo bekommen. Jede Hilfe mit diesen 3 Methoden wird geschätzt.

+1

Warum ‚haben Sie ersetzen 'zu' Es ', wenn Sie nur die 1.' s 'oder' S 'in jeder Arbeit ersetzen müssen? Können Sie das Layout korrigieren und ein oder mehrere eindeutige Beispiele angeben? –

+1

Haben Sie das erste Vorkommen von jedem 's' oder 'S' –

+0

@Hedgebox Ich hoffe, Sie haben Ihre Antwort. Aber haben einen anderen Ansatz zur Lösung Ihres Problems zur Verfügung gestellt. Siehe meine Antwort. – mmuzahid

Antwort

4

Approach-1: Ohne Verwendung von replace und split Methode für eine bessere Leistung.

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: Ansatz2: Wie Sie replaceFirst Methode verwenden müssen, und Sie wollen nicht StringBuilder hier verwenden, ist eine Option für Sie:

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. 

Hinweis: Ich ziehe Ansatz 1, weil es keine Overhead für die Methode replaceFisrt undhat, String append

+0

@ cricket_007 bearbeitet von gehen zu anderen Ansatz :) – mmuzahid

+0

ASCII-Verschiebung ... Es wird funktionieren, aber es ist sehr spezifisch für dieses eine Problem –

+0

@ cricket_007 ja .. .. aber ich hoffe, dass dies eine schnellere Lösung bietet als andere Antwort. – mmuzahid

1

Meine Methode wäre weniger abhängig von den genannten String-Methoden

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] + " "; 
} 
10

Eine Möglichkeit wäre, die Zeichenfolge in Worte zu spalten, und String.replaceFirst() dann auf jedes Wort verwenden das erste Vorkommen von s mit t (oder einen anderen gewünschten Buchstaben) zu ersetzen:

Update:

Ich habe meine Lösung refaktoriert, um das erste Vorkommen von s (Groß- oder Kleinschreibung) zu finden und die entsprechende Konvertierung darauf anzuwenden.

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()); 

Ausgang:

It Mitsissippi a Ttate where there are many tystems. 
+1

@ im-biegeleisen Ihre Lösung ist perfekt mit einigen Anpassungen. Überprüfen Sie meine Post –

+1

Dies wird das falsche Ergebnis für ein Wort wie "Systems" mit einem Großbuchstaben "S" und Kleinbuchstaben "s" (zumindest so, wie ich die Frage verstanden). – msandiford

+0

'Systeme' ->' Tyttems' ... was ist das Problem? –

3

Verwendung unter Änderung Tim Biegeleisen Antwort (vor seinem Posten Bearbeitung)

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()); 

bearbeiten - Sie können concat() verwenden

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); 

aktualisieren

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); 
+1

Ich möchte String-Methoden verwenden ... gibt es eine Möglichkeit, es ohne StringBuilder zu tun? – Hedgebox

+1

@hedgebox: check edit part –

+1

Perfekt viele tks. – Hedgebox

2

ich eine Methode erstellt haben, die -

  • für allgemeine Zwecke ist,
  • verwendet keine replace oder split und
  • verwendet nur ein Schleife.

Das folgende ist mein Code-Schnipsel:

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(); 
} 
1

Es gibt auch eine schöne, kompakte, strombasierte Lösung für die:

String result = Stream.of(s.split(" ")) 
    .map(t -> t.replaceFirst("s", "t")) 
    .map(t -> t.replaceFirst("S", "T")) 
    .collect(Collectors.joining(" ")); 
0
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);