我需要同时计算元音和辅音,但我对辅音感到困惑。

huangapple 未分类评论55阅读模式
标题翻译

I need to count both vowels and consonants but i am stumped on the consonants

问题

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);

        System.out.println("输入一些文本:");
        String str = in.nextLine();
        System.out.println(str);

        System.out.print("你的输入中有 " + count_Vowels(str) + " 个元音字母");
        System.out.print("和 " + count_Consonants(str) + " 个辅音字母");
    }

    public static int count_Vowels(String str) {
        int vcount = 0;
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') {
                vcount++;
            }
        }
        return vcount;
    }

    public static int count_Consonants(String str) {
        int ccount = 0;
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (ch >= 'a' && ch <= 'z') {
                if (ch != 'a' && ch != 'e' && ch != 'i' && ch != 'o' && ch != 'u') {
                    ccount++;
                }
            }
        }
        return ccount;
    }
}
英文翻译

I can't figure out how to have both vowels and consonants. The vowels part of the code works fine. I have no idea how to add the consonants.

import java.util.Scanner;

public class Main
{
   public static void main(String args[])
   {
      Scanner in = new Scanner(System.in);
   
      System.out.println(&quot;Enter some text: &quot;);
      String str = in.nextLine();
      System.out.println(str);

System.out.print(&quot;your input has &quot; + count_Vowels(str) + &quot;vowels&quot;);
    }
 public static int count_Vowels(String str)
    {
        int vcount = 0;
        for (int i = 0; i &lt; str.length(); i++)
        {
            char ch = str.charAt(i);
            if (ch == &#39;a&#39; || ch == &#39;e&#39; || ch == &#39;i&#39; || ch == &#39;o&#39; || ch == &#39;u&#39;)
            {
              vcount++;
            }
        }
        return vcount;
    }
public static int count_Consanants(String str)
    {
      int ccount = 0;
      for (int i = 0; i &lt; str.length(); i++)
    {
      char ch = str.charAt(i);
      if (ch == &#39;a&#39; || ch == &#39;e&#39; || ch == &#39;i&#39; || ch == &#39;o&#39; || ch == &#39;u&#39;)
      {
        vcount++;
      }
      else
      {
        consonants++;
      }
    }
  }  
}

I cannot seem to figure out the consonant part of the code

答案1

得分: 1

Your code will also count other characters that are not consonants. Here is a simple way to count vowels and consonants:

for (int i = 0; i < str.length(); i++) {    
    //Checks whether a character is a vowel
    if (str.charAt(i) == 'a' || str.charAt(i) == 'e' || str.charAt(i) == 'i' || str.charAt(i) == 'o' || str.charAt(i) == 'u') {      
        vCount++;    
    }    
    //Checks whether a character is a consonant    
    else if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z') {        
        cCount++;    
    }    
}

Similarly, you can also modify the code for upper case characters.


Slightly elegant:

Set<Character> vowels = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u'));
   
for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
    if (vowels.contains(c)) {
        vCount++;
    } else if (c >= 'a' && c <= 'z') {
        cCount++;
    }
}
英文翻译

Your code will also count other characters that are not consonants. Here is a simple way to count vowels and consonants:

for (int i = 0; i &lt; str.length(); i++) {    
    //Checks whether a character is a vowel
    if (str.charAt(i) == &#39;a&#39; || str.charAt(i) == &#39;e&#39; || str.charAt(i) == &#39;i&#39; || str.charAt(i) == &#39;o&#39; || str.charAt(i) == &#39;u&#39;) {      
        vCount++;    
    }    
    //Checks whether a character is a consonant    
    else if (str.charAt(i) &gt;= &#39;a&#39; &amp;&amp; str.charAt(i)&lt;=&#39;z&#39;) {        
        cCount++;    
    }    
}    

Similarly, you can also modify the code for upper case characters.


Slightly elegant:

Set&lt;Character&gt; vowels = new HashSet&lt;&gt;(Arrays.asList(&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;));
   
for (int i = 0; i &lt; str.length(); i++) {
    char c = str.charAt(i);
    if (vowels.contains(c)) {
        vCount++;
    } else if (c &gt;= &#39;a&#39; &amp;&amp; c &lt;= &#39;z&#39;) {
        cCount++;
    }
}

答案2

得分: 0

以下是一种实现方法。

  • 首先,将字符串转换为小写,以便于搜索。
  • 然后,设置一个字符串表示元音字母。如果要计算字母 y,可以将其添加进去。
  • 主要部分通过循环遍历数组,确保字符是字母,并计算计数。仅检查字母很重要,因为空格和标点符号可能会影响结果。
Scanner in = new Scanner(System.in);

System.out.println("输入一些文本:");
String str = in.nextLine().toLowerCase();
String vowels = "aeiou";
System.out.println(str);

int vcount = 0;
int ccount = 0;

for (char c : str.toCharArray()) {
    if (Character.isLetter(c)) {
        if (vowels.indexOf(c) >= 0) {
            vcount++;
        } else {
            // 必须是辅音
            ccount++;
        }
    }
}
System.out.printf("共有 %d 个元音和 %d 个辅音%n",
        vcount, ccount);
英文翻译

Here is one way to do it.

  • First it converts the string to lower case to facilitate the search
  • Then it sets a string to the vowels. You may want to add y if you're counting that
  • The main part loops thru the array, ensuring the character is a letter, and then tallying the counts. It is important to only check letters since spaces and punctuation marks could throw off the results.
Scanner in = new Scanner(System.in);
		
System.out.println(&quot;Enter some text: &quot;);
String str = in.nextLine().toLowerCase();
String vowels = &quot;aeiou&quot;;
System.out.println(str);
		
int vcount = 0;
int ccount = 0;
		
for (char c : str.toCharArray()) {
	if (Character.isLetter(c)) {
		if (vowels.indexOf(c) &gt;= 0) {
			vcount++;
		} else {
			// must be a consonant
			ccount++;
		}
	}
}
System.out.printf(&quot;There were %d vowels and %d consonants%n&quot;,
		vcount, ccount);
		

</details>



# 答案3
**得分**: 0

# 淘汰法过程

你说:

&gt;我在辅音上感到困惑

基本思想是,在你已经测试了字符是否(a)为拉丁字母的一部分,(b)是一个字母(不是数字、标点等),以及(c)不是元音之后,你可以假定你有一个辅音。

正如你在下面的代码示例中所看到的,我们使用级联的`if`语句检查每个字符,这里摘要为伪代码:

            if( … 不属于拉丁字母表,比如韩文或表情符号 )
            {
                other++;
            }
            else if( … 不是字母,比如数字或标点符号 )
            {
                other++;
            } 
            else if ( … 明确是元音 )
            {  
                vowel++;
            } 
            else if ( … 可能是元音(`y`) )
            {  
                maybeVowel++;
            } 
            else  // 否则肯定不是元音,所以一定是辅音。
            {  
                consonant++;
            }

# `char` 已过时

前两个答案基本上是对的,但使用了已经过时的 `char` 类型。该类型只能处理 Unicode 定义的 140,000 多个字符的不到一半。而且这些答案假定只有英语,没有变音符号等。

# Unicode 代码点

相反,养成使用整数的 [代码点][2] 习惯。

    String input = "😷 带医疗口罩的脸" ;

为文本中的每个字符创建一个代码点数的流。

    IntStream intStream = input.codePoints() ;

从流中创建一个数组。

    int[] codePoints = intStream.toArray();

循环处理每个代码点。

    for ( int codePoint : codePoints )
    {
        …
    }

首先检查字符是否在 [Unicode 中定义的拉丁字母表][3] 内。参考 [*如何判断 Unicode 代码点是否表示某个特定字母表(如拉丁字母)的字符?*](https://stackoverflow.com/q/62109781/642706)。

    if ( Character.UnicodeScript.LATIN.equals( Character.UnicodeScript.of( codePoint ) ) ) { … } else { other ++ ; ) 

接下来,我们必须测试这个字符是否是字母。

     if ( Character.isLetter( codePoint ) ) { … } else { other ++ ; )  

为了简化比较,我们应该转换为小写。

    int lowercaseCodePoint = Character.toLowerCase( codePoint );

接下来测试元音。我不知道 Java 或 Unicode 是否提供了元音与辅音的测试。因此,我们必须自己定义一组元音。我不了解所有基于拉丁字母表的语言,但至少我可以涵盖英语元音。当然,`y` 很棘手,所以我将把它计为 `maybeVowel` 计数。

    int[] vowelCodePoints = "aeiou".codePoints().toArray();
    int[] maybeVowelCodePoints = "y".codePoints().toArray();

我们将查看这些数组是否包含每个字符的代码点数。因此,对数组进行排序以启用二进制搜索。

    Arrays.sort( vowelCodePoints );
    Arrays.sort( maybeVowelCodePoints );

添加元音测试。

     if ( Arrays.binarySearch( vowelCodePoints , lowercaseCodePoint ) >= 0 )

添加可能元音测试。

    else if ( Arrays.binarySearch( maybeVowelCodePoints , lowercaseCodePoint ) >= 0 )

如果我们通过了这两个与元音相关的测试,我们可以假设我们的非元音小写拉丁字母是一个辅音。

将所有代码放在一起。

    String input = "😷 带医疗口罩的脸";

    IntStream intStream = input.codePoints();

    int[] codePoints = intStream.toArray();
    int[] vowelCodePoints = "aeiou".codePoints().toArray();
    int[] maybeVowelCodePoints = "y".codePoints().toArray();

    // 将这些数组排序以启用二进制搜索。
    Arrays.sort( vowelCodePoints );
    Arrays.sort( maybeVowelCodePoints );

    int vowel = 0;
    int maybeVowel = 0;
    int consonant = 0;
    int other = 0;
    for ( int codePoint : codePoints )
    {
        if ( Character.UnicodeScript.LATIN.equals( Character.UnicodeScript.of( codePoint ) ) )
        {
            if ( Character.isLetter( codePoint ) )
            {
                int lowercaseCodePoint = Character.toLowerCase( codePoint );
                if ( Arrays.binarySearch( vowelCodePoints , lowercaseCodePoint ) >= 0 )
                {  // 如果肯定是元音…
                    vowel++;
                } else if ( Arrays.binarySearch( maybeVowelCodePoints , lowercaseCodePoint ) >= 0 )
                {  // 否则如果可能是元音…
                    maybeVowel++;
                } else
                {  // 否则这个非元音小写拉丁字母一定是辅音。
                    consonant++;
                }
            } else { other++; }  // 否则不是字母。
        } else { other++; }      // 否则不在拉丁字母表内。
    }

在控制台输出。

    // 报告
    System.out.println( "RESULTS  ----------------------------------------------" );
    System.out.println( "input = " + input );
    System.out.println( "codePoints = " + Arrays.toString( codePoints ) );
    System.out.println( "Count code points: " + codePoints.length );
    System.out.println( "vowelCodePoints = " + Arrays.toString( vowelCodePoints ) );
    System.out.println( "maybeVowelCodePoints = " + Arrays.toString( maybeVowelCodePoints ) );
    System.out.println( "vowel = " + vowel );
    System.out.println( "maybeVowel = " + maybeVowel );
    System.out.println( "consonant = " + consonant );
    System.out.println( "other = " + other );
    System.out.println( "vowel + maybeVowel+consonant+other = " + ( vowel + maybeVowel + consonant + other ) );
    System.out.println( "END  ----------------------------------------------" );

# 示例用法

运行时

<details>
<summary>英文翻译</summary>

# Process of elimination

You said:

&gt;i am stumped on the consonants

The basic idea is that after you have tested for the character being (a) of the Latin-script, (b) being a letter (not a digit, punctuation, etc.), and (c) not a vowel, you can assume you have a consonant. 

As you can see at the center of the code example below, we examine each character with a cascading `if` statement, summarized here as pseudo-code:

            if( … not part of the Latin script, such as Korean or emoji )
            {
                other++;
            }
            else if( … not a letter, such as digit or punctuation )
            {
                other++;
            } 
            else if ( … definitely a vowel )
            {  
                vowel++;
            } 
            else if ( … maybe a vowel (`y`) )
            {  
                maybeVowel++;
            } 
            else  // Else definitely not a vowel, so it must be a consonant. 
            {  
                consonant++;
            }

# `char` is legacy

The first two Answers are basically right, but use the obsolete `char` type.  That type handles less than half of the over 140,000 characters defined in [Unicode][1]. And those Answers assume only English without diacriticals and such.


# Unicode code point

Instead, make a habit of using [code point][2] integer numbers instead. 

    String input = &quot;&#128567; Face with Medical Mask&quot; ;

Make a stream of the code point numbers for each character in the text.

    IntStream intStream = input.codePoints() ;

Materialize an array from the stream. 

    int[] codePoints = intStream.toArray();

Loop each code point.

    for ( int codePoint : codePoints )
    {
        …
    }

First see if the character is within the [Latin script defined in Unicode][3]. See [*Identify if a Unicode code point represents a character from a certain script such as the Latin script?*](https://stackoverflow.com/q/62109781/642706).

    if ( Character.UnicodeScript.LATIN.equals( Character.UnicodeScript.of( codePoint ) ) ) { … } else { other ++ ; ) 

Next we must test if this character is a letter or not.

     if ( Character.isLetter( codePoint ) ) { … } else { other ++ ; )  

To simplify our comparisons, we should convert to lowercase.

    int lowercaseCodePoint = Character.toLowerCase( codePoint );

Next test for vowels. I do not know that Java or Unicode provides a test for vowel versus consonant. So we must define a set of vowels ourselves. I do not know about all Latin-based languages, but I can at least cover English vowels. Of course, `y` is tricky, so I will count that as in a `maybeVowel` count.

    int[] vowelCodePoints = &quot;aeiou&quot;.codePoints().toArray();
    int[] maybeVowelCodePoints = &quot;y&quot;.codePoints().toArray();

We will want to see if those arrays contain each character&#39;s code point number. So sort the arrays to enable a binary search.

    Arrays.sort( vowelCodePoints );
    Arrays.sort( maybeVowelCodePoints );

Add a test for vowel.

     if ( Arrays.binarySearch( vowelCodePoints , lowercaseCodePoint ) &gt;= 0 )

Add a test for maybe vowel.

    else if ( Arrays.binarySearch( maybeVowelCodePoints , lowercaseCodePoint ) &gt;= 0 )

And if we get past both those vowel-related tests, we can assume our non-vowel lowercase Latin-script character is a consonant.

Put all the code together.

    String input = &quot;&#128567; Face with Medical Mask&quot;;

    IntStream intStream = input.codePoints();

    int[] codePoints = intStream.toArray();
    int[] vowelCodePoints = &quot;aeiou&quot;.codePoints().toArray();
    int[] maybeVowelCodePoints = &quot;y&quot;.codePoints().toArray();

    // Sort those arrays to enable binary search.
    Arrays.sort( vowelCodePoints );
    Arrays.sort( maybeVowelCodePoints );

    int vowel = 0;
    int maybeVowel = 0;
    int consonant = 0;
    int other = 0;
    for ( int codePoint : codePoints )
    {
        if ( Character.UnicodeScript.LATIN.equals( Character.UnicodeScript.of( codePoint ) ) )
        {
            if ( Character.isLetter( codePoint ) )
            {
                int lowercaseCodePoint = Character.toLowerCase( codePoint );
                if ( Arrays.binarySearch( vowelCodePoints , lowercaseCodePoint ) &gt;= 0 )
                {  // If definitely a vowel…
                    vowel++;
                } else if ( Arrays.binarySearch( maybeVowelCodePoints , lowercaseCodePoint ) &gt;= 0 )
                {  // Else if maybe a vowel…
                    maybeVowel++;
                } else
                {  // Else this non-vowel lowercase letter from Latin-script must be a consonant.
                    consonant++;
                }
            } else { other++; }  // Else not a letter.
        } else { other++; }      // Else not in Latin script.
    }

Dump to console.

    // Report
    System.out.println( &quot;RESULTS  ----------------------------------------------&quot; );
    System.out.println( &quot;input = &quot; + input );
    System.out.println( &quot;codePoints = &quot; + Arrays.toString( codePoints ) );
    System.out.println( &quot;Count code points: &quot; + codePoints.length );
    System.out.println( &quot;vowelCodePoints = &quot; + Arrays.toString( vowelCodePoints ) );
    System.out.println( &quot;maybeVowelCodePoints = &quot; + Arrays.toString( maybeVowelCodePoints ) );
    System.out.println( &quot;vowel = &quot; + vowel );
    System.out.println( &quot;maybeVowel = &quot; + maybeVowel );
    System.out.println( &quot;consonant = &quot; + consonant );
    System.out.println( &quot;other = &quot; + other );
    System.out.println( &quot;vowel + maybeVowel+consonant+other = &quot; + ( vowel + maybeVowel + consonant + other ) );
    System.out.println( &quot;END  ----------------------------------------------&quot; );

# Example usage


When run.

&lt;!-- language: lang-none --&gt;

    RESULTS  ----------------------------------------------
    input = &#128567; Face with Medical Mask
    codePoints = [128567, 32, 70, 97, 99, 101, 32, 119, 105, 116, 104, 32, 77, 101, 100, 105, 99, 97, 108, 32, 77, 97, 115, 107]
    Count code points: 24
    vowelCodePoints = [97, 101, 105, 111, 117]
    maybeVowelCodePoints = [121]
    vowel = 7
    maybeVowel = 0
    consonant = 12
    other = 5
    vowel + maybeVowel+consonant+other = 24
    END  ----------------------------------------------


----------

**Tip:** Read the humorous article, [*The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)*](https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/).




  [1]: https://en.wikipedia.org/wiki/Unicode
  [2]: https://en.wikipedia.org/wiki/Code_point
  [3]: https://en.wikipedia.org/wiki/Latin_script_in_Unicode

</details>



huangapple
  • 本文由 发表于 2020年5月31日 05:50:25
  • 转载请务必保留本文链接:https://java.coder-hub.com/62109094.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定