简体   繁体   English

Java元音计数器替代方法

[英]Java Vowel Counter Alternative Method

I'm writing a simple vowel-counter and was wondering if there's a cleaner alternative (possibly a loop?) to replace all of the else if 's when comparing s to the various vowels.我正在写一个简单的元音计数器,想知道在将s与各种元音进行比较时,是否有更干净的替代方案(可能是循环?)来替换所有else if

I can't think of a simple way to do this effectively as the number of each vowel must be shown individually.我想不出一个简单的方法来有效地做到这一点,因为每个元音的数量必须单独显示。 It would be very simple if it was just a total vowel count.如果它只是一个总元音数,那将是非常简单的。

I'm quite new to Java so I don't know what can be used to clean this up.我对 Java 很陌生,所以我不知道可以用什么来清理它。 If this is the best option, then I am contempt -- but I love cleaning up code where it can be!如果这是最好的选择,那么我很蔑视——但我喜欢在可能的地方清理代码!

import java.util.Scanner;

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

    int A = 0, E = 0, I = 0, O = 0, U = 0;

    System.out.print("Type a single word > ");
    String word = input.next();

    for (int i = 0; i < word.length(); i++) {
      String s = word.substring(i, i + 1);

      if (s.equalsIgnoreCase("A")) { A++; } 
      else if (s.equalsIgnoreCase("E")) { E++; }
      else if (s.equalsIgnoreCase("I")) { I++; }
      else if (s.equalsIgnoreCase("O")) { O++; }
      else if (s.equalsIgnoreCase("U")) { U++; } 
    }

    int total = A + E + I + O + U;
    System.out.println("\n'" + word + "' has...\n" + A + " A's\n" + E + " E's\n" + I + " I's\n" + O + " O's\n" + U + " U's\nTotal vowels: " + total + "\n");

    input.close();
  }
}

Input:输入:

Coding

Output:输出:

'Coding' has...
0 A's
0 E's
1 I's
1 O's
0 U's
Total vowels: 2

Here is a less repetitive way to code it, using an int array for the counts, and a string holding the sequence of vowels.这是一种不太重复的编码方式,使用一个 int 数组作为计数,并使用一个包含元音序列的字符串。

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Type a single word > ");
        String word = input.next();
        String vowels = "AEIOU";
        int[] counts = new int[vowels.length()];
        int total = 0;
        for (int i = 0; i < word.length(); i++) {
            int index = vowels.indexOf(Character.toUpperCase(word.charAt(i)));
            if (index >= 0) {
                ++counts[index];
                ++total;
            }
        }
        System.out.printf("%n'%s' has...%n", word);
        for (int i = 0; i < counts.length; ++i) {
            System.out.printf("%s %s's%n", counts[i], vowels.charAt(i));
        }
        System.out.printf("Total vowels: %s%n", total);
    }
}

Output:输出:

Type a single word > Coding

'Coding' has...
0 A's
0 E's
1 I's
1 O's
0 U's
Total vowels: 2

You could avoid a lot of repetition by using a Map that associates vowels (keys) to their frequencies within the word passed at runtime (values).您可以使用Map将元音(键)与其在运行时传递的word (值)中的频率相关联,从而避免大量重复。

It is worth noting that a LinkedHashMap is used in the below example as to preserve the insertion order of keys for printing at the end of the program - as would not be the case with a HashMap .值得注意的是,在下面的示例中使用了LinkedHashMap以保留键的插入顺序,以便在程序结束时打印 - 与HashMap的情况不同。

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        // Define Map to map vowels to frequencies
        Map<Character, Integer> vowels = new LinkedHashMap<Character, Integer>();
        vowels.put('A', 0);
        vowels.put('E', 0);
        vowels.put('I', 0);
        vowels.put('O', 0);
        vowels.put('U', 0);
        
        // Get input from user
        System.out.print("Type a single word > ");
        String word = input.next();
        
        // Iterate across word 
        for (int i = 0; i < word.length(); i++) {
          String c = word.substring(i, i+1); // Get current char
          for (Character key : vowels.keySet()) { // Iterate across vowels
              if (c.equalsIgnoreCase(key.toString()))  { 
                  vowels.put(key, vowels.get(key)+1); // Increment vowel frequency if matched
                  break; // Break inner loop and move to next char in word
          }
        }
        // Sum total
        int total = 0;
        for (Character key : vowels.keySet()) {
        total += vowels.get(key);
        }
        
        // Print results to console
        System.out.println("\'" + word + "\'" + " has...");
        for (Character key : vowels.keySet()) {
        System.out.println(vowels.get(key) + " " + key + "\'s");
        }
        System.out.println("Total vowels: " + total);
        
        input.close();
      }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM