2016-11-15 24 views
0

ランダムに生成された20文字の単語から母音を削除しようとしています。この割り当てには部分文字列を使用する必要がありますが、概念的に問題があります。このコードでは、wordの値は決して変更されず、元の値のままです。文字列の後半にi + 2を実行すると、2つの文字が飛び越し、2つの母音が直後にあるときには上になります。部分文字列を使用する必要がある場合は、毎回これを改善する方法を教えてください。文字列から文字を削除しようとしています

public class WordsWithoutVowels { 
    String finalWord; 

    public WordsWithoutVowels(String word) { 
     for(int i = 0; i < 20; i++) { 
      if(word.charAt(i) == 'a') {word = word.substring(0, i) + word.substring(i++);} 
      if(word.charAt(i) == 'e') {word = word.substring(0, i) + word.substring(i++);} 
      if(word.charAt(i) == 'i') {word = word.substring(0, i) + word.substring(i++);} 
      if(word.charAt(i) == 'o') {word = word.substring(0, i) + word.substring(i++);} 
      if(word.charAt(i) == 'u') {word = word.substring(0, i) + word.substring(i++);} 
      if(word.charAt(i) == 'y') {word = word.substring(0, i) + word.substring(i++);}   
      System.out.println(word); 
     } 
     finalWord = word; 
    } 

    public String getWord() 
    { 
     return finalWord; 
    } 
} 
+0

あなたは単語からの手紙を削除すると、それもわずか1つの文字短くなったことを覚えておいてください。ヒントとして、後ろにループすることでもっと楽になります:) –

+0

"matthew"の場合、結果として "mtthw"が必要です。 –

+0

@Fildorこれはコンストラクタです。それはコンパイルします – yunandtidus

答えて

2

あなたはそうするために、以下のように単純化されたコードを使用することができます。

public static void main(String[] args) { 
     String stringPara = "this example will remove the vowals aeiou"; 
     stringPara = removeCharFromString(stringPara, "a"); 
     stringPara = removeCharFromString(stringPara, "e"); 
     stringPara = removeCharFromString(stringPara, "i"); 
     stringPara = removeCharFromString(stringPara, "o"); 
     stringPara = removeCharFromString(stringPara, "u"); 
     System.out.println(stringPara); 
    } 

    public static String removeCharFromString(String str, String characterToRemove){ 
     while(str.contains(characterToRemove)){ 
      str = str.substring(0, str.indexOf(characterToRemove)) + str.substring(str.indexOf(characterToRemove)+1, str.length()) ; 
     } 
     return str; 
    } 
+0

ヒント: " IndexOutOfBoundsException - beginIndexが負の場合、またはendIndexがこのStringオブジェクトの長さより大きい場合、または** beginIndexがendIndex **より大きい場合。 – Fildor

+0

私はそうは思わない...これは動作する例で、str.が文字を含んでいる場合にのみ実行されます。 endIndexよりもbeginIndexが大きい点はありません –

+1

文字列の最後の文字が母音ならどうなりますか? – Fildor

0

あなたは、単純な正規表現を使用することはありませんなぜ?私はあなたの元の溶液を固定Hll wrld!

+2

OPは部分文字列のみを扱います。 –

+0

別の回答が悪いですか? –

+0

質問の引用:*「この課題には部分文字列を使用する必要がありますが、概念的には問題があります。」* - この回答は機能しますが、実際に質問には答えません。 –

0

String str = "Hello world!"; 
str = str.replaceAll("[AEIOUaeiou]", ""); 

strの新しい値になります。まず第一に、各文字を繰り返してword.length()にします。他の問題は "i"を増やすことでした。

for (int i = 0; i < word.length();) { 
    if (word.charAt(i) == 'a') { 
    word = word.substring(0, i) + word.substring(i+1); 
    continue; 
    } 
    if (word.charAt(i) == 'e') { 
    word = word.substring(0, i) + word.substring(i+1); 
    continue; 
    } 
    if (word.charAt(i) == 'i') { 
    word = word.substring(0, i) + word.substring(i+1); 
    continue; 
    } 
    if (word.charAt(i) == 'o') { 
    word = word.substring(0, i) + word.substring(i+1); 
    continue; 
    } 
    if (word.charAt(i) == 'u') { 
    word = word.substring(0, i) + word.substring(i+1); 
    continue; 
    } 
    if (word.charAt(i) == 'y') { 
    word = word.substring(0, i) + word.substring(i+1); 
    continue; 
    } 
    i++; 
    System.out.println(word); 
} 
finalWord = word; 

ここでは、よりエレガントな方法:

public class WordsWithoutVowels { 

    String finalWord; 
    List<Character> vowels = Arrays.asList('a', 'e', 'i', 'o', 'u', 'y'); 


    public WordsWithoutVowels(String word) { 
    for (int i = 0; i < word.length();) { 
     if (vowels.contains(word.charAt(i))) { 
     word = word.substring(0, i) + word.substring(i + 1); 
     continue; 
     } 
     i++; 
     System.out.println(word); 
    } 
    finalWord = word; 
    } 


    public String getWord() { 
    return finalWord; 
    } 
} 
0

問題は、あなたのi++演算子です。それはあなたの文字チェックとあなたのループの両方を混乱させます。ポストデクリメント演算子(i++)は、メソッド引数として元の値のiをとりますが、後続のすべての命令でその値を1増加させます。

これを説明するために、入力が「Treyarch」であるとします。次に、インデックス2ではiの文字はeです。そして、命令 word = word.substring(0, i) + word.substring(i++);は、次のような結果になります。

word = Treyarch

i = 3

だけでなく、それはまたあなたのインデックス(iを)台無しStringから母音を追放しません。ループの残りの部分ではiが4であり、次の繰り返しを入力すると5になるので、プログラムは最初の2つのif条件をチェックしません。

説明すると、このソリューションのベストプラクティスは、if文のいずれかの条件をチェックし、不変のインデックスを使用することです。言い換えれば、

for(int i = 0; i < word.length(); i++) { 
    if(word.charAt(i) == 'a' || word.charAt(i) == 'e' || word.charAt(i) == 'i' || word.charAt(i) == 'o' || word.charAt(i) == 'u' || word.charAt(i) == 'y') { 
     word = word.substring(0, i) + word.substring(i + 1); 
} 
0

あなたのインクリメンテーションロジックに問題があります。 charを削除すると、次の文字が欠落していました。

switch文を使用すると、コードを読みやすくすることができます。

public class WordsWithoutVowels { 
     String finalWord; 

     public WordsWithoutVowels(String word) { 
      // don't go too far !! 
      for (int i = 0; i < word.length(); i++) { 
       switch (word.charAt(i)) { 
        case 'a': 
        case 'e': 
        case 'i': 
        case 'o': 
        case 'u': 
        case 'y': 
         // remove this vowel 
         word = word.substring(0, i) + word.substring(i + 1); 
         // step back in order to analyse the new i-th char 
         i--; 

       } 
       System.out.println(word); 
      } 
      finalWord = word; 
     } 

     public String getWord() { 
      return finalWord; 
     } 
    } 
0
public static void main(String[] args) 
{ 
String WordsWithoutVowels ="mayank"; 
String updated=""; 
for(char char1: WordsWithoutVowels.toCharArray()) 
{ 
switch(char1) 
{ 
    case 'a': 
    case 'e': 
    case 'i': 
    case 'o': 
    case 'u': 
     break; 
    default: 
     updated+=char1; 

} 
} 
    System.out.println(updated); 
} 
+0

OPは "substring"を使用しなければならないと述べています。 – Fildor

+0

部分文字列の割り当てがない場合は、これが最も効率的です。 – yunandtidus

+0

はい、そうだと思います。 –

0

要件を満たすためにあなたのソリューションを簡素化。

public class WordsWithoutVowels { 
    String finalWord; 

    public WordsWithoutVowels(String word) { 
     StringBuilder sb = new StringBuilder(word); 

     for(int i = 0; i < sb.length;) { 
      if(sb.charAt(i)=='a' || sb.charAt(i)=='e' || sb.charAt(i)=='i' || sb.charAt(i)=='o' || sb.charAt(i)=='u') 
       sb.deleteCharAt(i); 
      else 
       i++; 
      } 
     finalWord = sb.toString(); 
    } 

    public String getWord() 
    { 
     return finalWord; 
    } 
} 
0
public WordsWithoutVowels(String word) {   
    for (int i = 0; i < 20; i++) 
      { 
    if (word.charAt(i) == 'a') { 
     word = word.substring(0, i) + (i == 19 ? "" : word.substring(++i));    } else if (word.charAt(i) == 'e') { 
       word = word.substring(0, i) + (i == 19 ? "" : word.substring(++i));    } else if (word.charAt(i) == 'i') { 
       word = word.substring(0, i) + (i == 19 ? "" : word.substring(++i));    } else if (word.charAt(i) == 'o') { 
       word = word.substring(0, i) + (i == 19 ? "" : word.substring(++i));    } else if (word.charAt(i) == 'u') { 
       word = word.substring(0, i) + (i == 19 ? "" : word.substring(++i));    } if (word.charAt(i) == 'y') { 
       word = word.substring(0, i) + (i == 19 ? "" : word.substring(++i));    }   System.out.println(word + " " + i); 
     }  finalWord = word; } 
関連する問題