2016-10-15 5 views
0

Ich versuche, ein Programm zu schreiben, die einen String und entfernt alle Instanzen einer anderen Zeichenfolge von ihm. Zum Beispiel: ("Remove them all!", "em") würde "Rove th all!" drucken. Wenn ich das aber ausführe, gebe es mir java.lang.StringIndexOutOfBoundsException.Warum erhalte ich einen java.lang.StringIndexOutOfBoundsException Empfang

public class LabFive { 

    public static String removeAll(String oldPhrase, String removal){ 
     String newPhrase = ""; 
     for(int i = 0; i <= oldPhrase.length(); i++){ 
      if(oldPhrase.substring(i, (removal.length() + i)) == removal) 
       newPhrase = newPhrase + oldPhrase.substring((removal.length() + 2 + i), oldPhrase.length());   
     } 
     return(newPhrase); 
    } 

    public static void main(String[] args) { 
     System.out.println(removeAll("AaAaAa", "a")); 
    } 
} 
+0

W Du kannst '' replace ("em", "") 'nicht benutzen? –

+0

Warum schaust du nicht auf die gegebene Antwort und vielleicht [accept] (http://stackoverflow.com/help/accepted-answer) diejenige, die dir am meisten hilft? –

Antwort

0

Ihr Code scheint mehrere Probleme zu haben. Zum einen können Sie nicht == verwenden für String-Gleichheit zu überprüfen, müssen Sie String.equals() Methode verwenden. Read here.

Zweitens Ihre for -Schleife 0-oldPhrase.length() einschließlich, aber versuchen, diesen Längenwert für den Index zu verwenden, wird die Ausnahme verursachen auftreten. In Java haben Strings einen nullbasierten Index, der Index beginnt also bei 0 und endet bei oldPhrase.length()-1.

Drittens scheint die Logik gebrochen. Die substring(int, int) Methodenparameter sind beginIndex und endIndex. Also:

newPhrase = newPhrase + oldPhrase.substring((removal.length() + 2 + i), oldPhrase.length()); 

verketten Teil der oldPhrasebis zum Ende zum newPhrase ist nicht gehen zu tun, was Sie wollen.


Hier ist der Weg, wie ich es gemacht habe. Die Idee ist einfacher und klarer. Ich habe einen Kommentar hinzugefügt, um es klarzustellen.

Testen Sie den Code live auf Repl.it

public static String removeAll(String oldPhrase, String removal) { 

    // if removal is not found return the original string 
    if(oldPhrase.indexOf(removal) == -1) { 
     return oldPhrase; 
    } 

    int removalLength = removal.length(); // storing the length so as not to call .length() again and again 

    for(int i = 0; i < oldPhrase.length(); i++) { // note that <= will cause the exception too 
     int idxOfRemoval = oldPhrase.indexOf(removal); 

     if(idxOfRemoval == i) { // removal is found at the current index, i.e. at index i 
      // take substring from beginning to index of removal + 
      // substring from the end of removal to end of original string 
      oldPhrase = oldPhrase.substring(0, idxOfRemoval) + oldPhrase.substring(idxOfRemoval+removalLength); 
     } 
    } 
    return(oldPhrase); 
} 

public static void main(String[] args) { 
    System.out.println(removeAll("AaAaAa", "a")); 
} 

Ausgang:

AAA 
0

Der einfachste Weg, die java.lang.StringIndexOutOfBoundsException ist in der Schleife zu erklären:

for(int i = 0; i <= oldPhrase.length(); i++){...} 

seit i wird sich gleich oldPhrase.length() haben Sie ein Problem em mit dem Teil bekommen:

oldPhrase.substring(i, (removal.length() + i)) 

so Sie am Ende mit schließlich

oldPhrase.substring(oldPhrase.length(), (removal.length() + oldPhrase.length())) 

Dies ist ein Problem, weil der höchste Index in einer Zeichenfolge length - 1 ist und Sie versuchen, den Index auf length zugreifen .

Ein Brute-Force-Weg removeAll zu tun wäre, über die Zeichenfolge iterieren (wie du) und nur zu überprüfen, für jedes Zeichen in i, wenn removal beginnt dort und dann die Zeichenfolge, die Sie würde zurückkehren wollen

sein

sub(0,i) + removeAll(the rest off your string starting at i+removal.length)

public static String removeAll(String oldPhrase,String removal) { 
    int rem = removal.length(); 
    int n = oldPhrase.length(); 
    // if length of oldPhrase is shorter than removal 
    // then there nothing you need to remove 
    if (n < rem) return oldPhrase; 

    // iterate over your string 
    for (int i = 0; i <= n - rem; i++) { 
     int j; 
     // check if there is a substring, removal, starting at i 
     for (j = 0; j < rem; j++) { 
      if (oldPhrase.charAt(i+j) != removal.charAt(j)) 
       break; 
     } 
     // if there is... 
     if (j == rem) { 
      // return stuff before substring you want to remove + 
      //  removeAll(the stuff after substring you want to remove) 
      return oldPhrase.substring(0,i) + removeAll(oldPhrase.substring(i+rem,n),removal); 
     } 
    } 
    return oldPhrase; 
} 

public static void main(String[] args) { 
    System.out.println(removeAll("AaAaAa", "a")); 
} 

output:

AAA

Verwandte Themen