0

子音を StringBuilder 変数に追加する適切な方法について助けが得られるかどうか疑問に思っていました。

現状では、文に含まれる母音の数を正常に見つけてカウントアップしますが、それらを除外する新しい変数を作成するのに問題があります。

    char[] vowels = {'a', 'e', 'i', 'o', 'u'};
    int vowelCount = 0;
    String defParagraph = "This is an example sentence.";
    StringBuilder sbParagraph = new StringBuilder(defParagraph);
    StringBuilder vowParagraph = new StringBuilder("");

    System.out.print("Characters: " + sbParagraph.length());

    for (int i = 0; i < sbParagraph.length(); i++) {
        for (int j = 0; j < vowels.length; j++) {
            if (sbParagraph.toString().toLowerCase().charAt(i) == vowels[j]) {
                vowelCount++;
            }
        }
    }

vowParagraph.append(sbParagraph.charAt(i)単純にループにa を追加しようとしましたが、新しい文字列に同じ文字の倍数が含まれています。また、元の StringBuilder 変数をコピーして単に文字を削除することも考えましたが、それを行う最善の方法がわかりません。

2 つのループと 1 つの配列に固執する必要があるのか​​、それとも単純に大規模な if/then 条件を作成して値をチェックする必要があるのか​​はわかりません。正直なところ、これが最も簡単な方法のように思えますが、少し冗長で非効率的でもあります。

誰かが私の愚かさを明らかにするのを手伝ってくれるなら、私はそれを感謝します. これは私を夢中にさせています。

4

5 に答える 5

2

これが代替バージョンです。

String regex = "[aeiou]";
Matcher m = Pattern.compile(regex,Pattern.CASE_INSENSITIVE).matcher(defParagraph); 
while (m.find()) {
  vowelCount++;
}
String vowParagraph=defParagraph.replaceAll(regex, "").toLowerCase();  
于 2012-08-17T17:31:25.903 に答える
1

O(N^2)ループ を回避するには?

Set<Character> vowels = new HashSet<Character>(Arrays.asList('a','e','i','o','u'));  
int vowelCount = 0;
String sbParagraph = "This is an example sentence.";
StringBuilder vowParagraph = new StringBuilder();

System.out.print("Characters: " + sbParagraph.length());

for (int i = 0, len = sbParagraph.length(); i < len; i++) {  
    int theChar = sbParagraph.charAt(i);
    if(vowels.contains(Character.toLowerCase(theChar)){    
        vowelCount++;    
     }  
     else{  
         vowParagraph.append(theChar);
      }  
}  
于 2012-08-17T17:46:12.327 に答える
1

倍数を避けるために、次のようにループを変更できます。

for (int i = 0; i < sbParagraph.length(); i++) {
    char c = defParagraph.toLowerCase().charAt(i);
    boolean isVowel = false;
    for (int j = 0; j < vowels.length; j++) {
        if (c == vowels[j]) {
            isVowel = true;
            break;
        }
    }
    if (isVowel) {
        vowelCount++;
    } else {
        vowParagraph.append(c);
    }
}
于 2012-08-17T17:05:53.403 に答える
1

これは他のいくつかの回答と似ていますが、コードからの変更が行われた理由についていくつかの調整と説明があります。ただし、正規表現がオプションである場合は、Adiの回答をご覧ください。彼は問題に取り組むための別の方法を教えてくれますが、これは宿題なので、それが実行可能な解決策であるかどうかはわかりません. とにかく、説明付き(最終製品の一番下までスキップしてください):

最初に宣言する内容の変更

int vowelCount = 0;
// All the Strings/StringBuilders can be final since we will never reinstantiate them
final String defParagraph = "This is an example sentence.";
// We'll just make a lowercase version here. That way we don't 
// .toLowerCase() everytime though the loop, and for people that complain
// about trying to optimize - I think it's easier to read too.
final String lowerCaseVersion = defParagraph.toLowerCase();
// Declare the stringBuilder with the size of defParagraph. That is the
// maximum size the vowel-less text could be, and ensures the stringBuilder
// won't overflow it's initial capacity and have to waste time growing.
final StringBuilder newParagraph = new StringBuilder(defParagraph.length());
// Not using the vowel array. We will remove the loop 
// and just || them together - see below
//char[] vowels = {'a', 'e', 'i', 'o', 'u'};
// You didn't need sbParagraph for anything you had (defParagraph works fine).
// Also, you could have just been a regular String since you never changed it.
//StringBuilder sbParagraph = new StringBuilder(defParagraph);
// Don't need vowParagraph since we aren't tracking the actual vowels, just the count
//StringBuilder vowParagraph = new StringBuilder("");

実際のループへの変更

 for (int i = 0; i < lowerCaseVersion.length(); i++) {
  // grab the current character
  char tempChar = lowerCaseVersion.charAt(i);
  if ('a' == tempChar || 'e' == tempChar || 'i' == tempChar 
        || 'o' == tempChar || 'u' == tempChar) {
    // It matched one of the vowels, so count it
    vowelCount ++;
  } else {
    // It didn't match a vowel, so add it the consonants stringBuilder
    // Oh, and append a character from the original, not the lowerCaseVersion
    newParagraph.append(defParagraph.charAt(i));
  }
}

そして、コメントなしですべて一緒に:

int vowelCount = 0;
final String defParagraph = "This is an example sentence.";
final String lowerCaseVersion = defParagraph.toLowerCase();
final StringBuilder newParagraph = new StringBuilder(defParagraph.length());

System.out.println("Characters: " + defParagraph.length());

for (int i = 0; i < lowerCaseVersion.length(); i++) {
  char tempChar = lowerCaseVersion.charAt(i);
  if ('a' == tempChar || 'e' == tempChar || 'i' == tempChar 
        || 'o' == tempChar || 'u' == tempChar) {
    vowelCount ++;
  } else {
    newParagraph.append(defParagraph.charAt(i));
  }
}

System.out.println("\tVowel: " + vowelCount);
System.out.println("\tDefPara: " + defParagraph.toString());
System.out.println("\tNewPara: " + newParagraph.toString());

出力は次のようになります。

Characters: 28
  Vowels: 9
  DefPara: This is an example sentence.
  NewPara: Ths s n xmpl sntnc.

ノート

  1. この場合、使用finalは本当にオプションです。できる限り使用する傾向がありますが、おそらく個人的な好みです。この質問には、いつ使用するかについての議論finalがあり、チェックする価値があるかもしれません。
于 2012-08-17T19:01:12.073 に答える
1

あなたはあなたの結果がどうあるべきかを述べていませんか?文に含まれる母音の数を数えたいだけですか? それとも、一意の母音を表す文字列を最後に付けたいですか?

文のす​​べての母音を最後に含む文字列が必要な場合は、考えていたことを実行してください。母音をfor(int j...ループに追加します。倍数が表示されているのは、文に倍数があるためです。(i が 2 つ、a が 2 つ、e が 5 つ)。

編集:あなたの質問には、「consonantsStringBuilder への追加を手伝ってほしい」と書かれていることに気付きました。では、なぜ母音を気にするのでしょうか。

編集2:子音のみをStringbuilderに追加するには、これを試してください

    String defParagraph = "This is an example sentence.";
    StringBuilder sbParagraph = new StringBuilder(defParagraph);
    StringBuilder conPara = new StringBuilder();

    System.out.println("Characters: " + sbParagraph.length());

    for (int i = 0; i < sbParagraph.length(); i++) {
        char c = sbParagraph.toString().toLowerCase().charAt(i);
        if (c == 'a' || c=='e' || c=='i' || c=='o' || c=='u') {
            continue; // Skip this character.
        }
        conPara.append(c);
    }

    System.out.println("conPara: " + conPara);

出力は次のとおりです。

 Characters: 28
 conPara: ths s n xmpl sntnc.

これは宿題なので、スペースを削除する方法を理解するために残します。(母音でも子音でもありません)。

于 2012-08-17T17:38:15.853 に答える