2015-11-24 4 views
0

Этот метод, который я пытался записать, должен брать строку, а затем массив строк, которые должны быть вставлены в исходную строку любым символом "_", с символом a/an перед ним, в зависимости от того, что подходит. Он будет использоваться, если строки, которые нужно вставить, являются переменными, и я не знаю, должно ли оно быть или. Но это не сработает. Например, если theString составляет всего "_" и array - {pineapple}, то он печатает a pineapple_. Если theString - "I am holding _, which is not a fruit, like _" и array - {pineapple, apple}, он печатает I am holding _, which is not a fruit, like a pinapple_. Я посмотрел на него, но я не могу найти проблему. Я не уверен, как работает класс stringBuilder, поэтому проблема может быть связана с этим. Спасибо за любую помощь, которую вы можете мне дать!Использование StringBuilder для заполнения пробелов в строке

public static void printWithVar(String theString, String[] array){ 
    int arrayPosition = 0; 
    String insert; 
    StringBuilder builder = new StringBuilder(theString); 
    for (int i = 0;i <= theString.length();i++){ 
     // if a "_" is found 
     if (theString.substring(i).equals("_")){ 
      // if the first letter is a vowel 
      if (array[arrayPosition].substring(0).equalsIgnoreCase("a") || array[arrayPosition].substring(0).equalsIgnoreCase("e") || array[arrayPosition].substring(0).equalsIgnoreCase("i") || array[arrayPosition].substring(0).equalsIgnoreCase("o") || array[arrayPosition].substring(0).equalsIgnoreCase("u")){ 
       builder.deleteCharAt(i); 
       insert = "an " + array[arrayPosition]; 
      } 
      // if just an "a" 
      else{ 
       builder.deleteCharAt(i); 
       insert = "a " + array[arrayPosition]; 
      } 
      builder = new StringBuilder(theString = theString.substring(0, i) + insert + theString.substring(i)); 
      arrayPosition++; 
      i += insert.length(); 

      // if there are no more strings to insert 
      if (arrayPosition == array.length){ 
       break;// for loop searching for "_" characters 
      } 
     }// end if an "_" is found 
    }// end loop 
    System.out.println(builder.toString()); 
}// end printWithVar 
+1

Подсказка:., Вместо того, чтобы играть с '.substring() равно()', просто [ '.split ("_")'] (http://docs.oracle.com/javase/6 /docs/api/java/lang/String.html#split%28java.lang.String,%20int%29) исходную строку. Вам нужно будет только добавить куски вашего заменяющего массива между разделенными строками. Кроме того, попробуйте присвоить имена вашим переменным, чтобы их цель была очевидна из имен; он действительно помогает писать более чистый код. – 9000

ответ

0

В ответ на первый комментарий (на 9000) я изменил код на это, и теперь он работает.

public static void printWithVar(String theString, String[] insertArray){ 
    String[] splitStrings = theString.split("_"); 
    String output = ""; 
    String insert; 
    // loop until there are no mmore inserts 
    for (int i = 0;i < insertArray.length;i++){ 
     // if an is appropriate 
     if (insertArray[i].substring(i).equalsIgnoreCase("a") || insertArray[i].substring(i).equalsIgnoreCase("e") || insertArray[i].substring(i).equalsIgnoreCase("i") || insertArray[i].substring(i).equalsIgnoreCase("o") || insertArray[i].substring(i).equalsIgnoreCase("u")){ 
      insert = "an " + insertArray[i]; 
     } 
     // if a is appropriate 
     else{ 
      insert = "a " + insertArray[i]; 
     } 
     // add everything needed to the output string 
     output = output + splitStrings[i] + insert; 
    }// end the loop 
    // print the resulting string 
    System.out.println(output); 
}// end printWithVar 
0

Если бы принять альтернативное решение, я хотел бы использовать StringTokenizer:

public static void printWithVar(String theString, String[] array) { 
    final List<Character> vowels = Arrays.asList(new Character[] { 'a', 'e', 'i', 'o', 'u' }); 

    StringTokenizer tok = new StringTokenizer(theString, "_", true); 
    StringBuilder result = new StringBuilder(); 
    int i = 0; 
    while (tok.hasMoreTokens()) { 
     String token = tok.nextToken(); 
     if (token.equals("_")) { 
      if (i >= array.length) { 
       continue; 
      } 
      String replacement = array[i]; 
      if (vowels.contains(replacement.toLowerCase().charAt(0))) { 
       result.append("an " + replacement); 
      } else { 
       result.append("a " + replacement); 
      } 
      i++; 
     } else { 
      result.append(token); 
     } 
    } 
    System.out.println(result.toString()); 
} 
0

Вы можете использовать IndexOf вместо который возвращает позицию первого вхождения "_" или -1, если это не найденный. В то время как "_" можно найти, используйте метод .replace(...) для замены "_" со словом из массива строк array[wordArrayPosition].

public static void printWithVar(String theString, String[] array){ 
    int wordArrayPosition = 0; 
    String[] vowels = {"a", "e", "i", "o", "u"}; 
    StringBuilder builder = new StringBuilder(theString); 

    int indexOfSymbol = builder.indexOf("_"); 
    while (indexOfSymbol != -1) { 

     //Adding a or an to the word 
     String word = null; 
     if (Arrays.asList(vowels).contains(array[wordArrayPosition].charAt(0))){ 
      word = "an " + array[wordArrayPosition]; 
     } else { 
      word = "a " + array[wordArrayPosition]; 
     } 
     //Checking if the word need to be capitalized 
     if ((indexOfSymbol == 0) || (builder.charAt(indexOfSymbol - 1) == '.')) { 
      word = "A" + word.substring(1); 
     } 

     builder.replace(indexOfSymbol, indexOfSymbol + 1, word); 
     wordArrayPosition += 1; 
     indexOfSymbol = builder.indexOf("_"); 
    } 
    System.out.println(builder.toString()); 
}