【问题标题】:Creating a Character Array with a Certain Number of Vowels and Consonants (Java)创建具有一定数量元音和辅音的字符数组(Java)
【发布时间】:2017-12-22 00:03:40
【问题描述】:

我正在尝试创建一个输出十个小写字母字符的程序 - 五个元音和五个辅音。为了做到这一点,我首先创建了一个 char 数组,其范围在 'a''z' 之间,称为 letters[],大小为 10。一旦数组被填充,我将使用格式打印输出包含数组中所有内容的字符串。

我的问题是,如何使程序输出每种类型的五个(并保持完全随机打印的字符顺序)?我曾考虑过使用switch 语句,每个辅音和元音都有一个格,但到目前为止我的想法似乎过于复杂和不优雅。

到目前为止的代码:

char letters[] = new char[10];
for(int i = 0; i < letters.length; i++){ //Open for

letters[i] = (char)(97 + Math.random() * 26);
char idx = letters[i];

System.out.printf("%s",idx);

} //End for

【问题讨论】:

  • 只需将 5 个随机辅音和 5 个随机元音放入一个数组并随机播放。
  • 也许你可以向我们展示你的代码,因为我不清楚你是如何填充你的数组的。猜测一下,也许您可​​以不断计算您在letters 中添加了多少个元音和多少个辅音。一旦达到 5 个,就停止添加该类型。
  • 我会将我的代码添加到 OP。内容不多,但希望它能让您了解我想怎么做。
  • @shmosel 有没有一种简单的方法可以在我打印时简单地打乱数组的内容?如果是这样,那会让我的生活更轻松。
  • 查找 Fisher-Yates 洗牌。

标签: java arrays random character


【解决方案1】:

如果您不介意更多与字符串相关的解决方案,这里有一个。我假设您不希望在输出字符串中重复任何辅音或元音,因此该算法会在使用字母后将其删除以供考虑。它还提供了更多的通用字母选择程序,不仅限于元音和辅音。

import java.lang.StringBuilder;

public class Shuffler {
    public static String CONSONANTS = "bcdfghjklmnpqrstvwxyz";
    public static String VOWELS = "aeiou";

    /*
     * Returns a new string that is a combination of the current string and 'count'
     * characters from the source string (using any character in the source string
     * no more than one time).
     */
    public static String shuffleIntoString(String current, String source, int count) {
        if (current == null || source == null || count < 0 || count > source.length()) {
            System.out.println("Error in parameters to shuffleIntoString");
            return null;
        }

        StringBuilder retval = new StringBuilder(current);        // build up by inserting at random locations
        StringBuilder depletedSource = new StringBuilder(source); // remove characters as they are used

        for (int i = 0; i < count; i++) {
            int pick = (int) (Math.random() * depletedSource.length());
            int whereToInsert = (int) (Math.random() * retval.length());
            retval = retval.insert(whereToInsert, depletedSource.charAt(pick));
            depletedSource.deleteCharAt(pick);
        }

        return retval.toString();
    }

    public static void main(String[] args) {
        Shuffler shuf = new Shuffler();

        for (int i = 0; i < 10; i++) {
            String result = shuf.shuffleIntoString("", shuf.CONSONANTS, 5);
            result = shuf.shuffleIntoString(result, shuf.VOWELS, 5);
            System.out.println(result);
        }
    }
}

输出如下:

kqoibauzed
uhcawoerib
afdzoemius
yuagocibej
eiuhaokcyq
ouveiawrxn
uyaiveomxn
ruxeoalhij
uraliwfeoc
afoutiesmr

【讨论】:

    【解决方案2】:

    如果您满足于使用ArrayLists,这将实现您的愿望。要生成随机字符,您可以在相应字符字符串的索引中生成一个数字,并将该值添加到 ArrayList。 Collections 是一个有用的类,您可以使用它来随机播放列表。

    List<Character> list = new ArrayList<>();
    
    String consonants = "bcdfghjklmnpqrstvwxyz";
    String vowels = "aeiou";
    
    Random r = new Random();
    
    for (int i = 0; i < 5; i++) {
        list.add(consonants.charAt(r.nextInt(consonants.length()))); // Add consonant
        list.add(vowels.charAt(r.nextInt(vowels.length()))); // Add vowel
    }
    Collections.shuffle(list);
    
    for (Character c : list) {
        System.out.println(c);
    }
    

    【讨论】:

      【解决方案3】:

      我没有看到任何关于重复的规则,但如果你愿意,你可以在选择后从数组中删除后者。

          List<Character> vowels = Arrays.asList('a', 'e', 'i', 'o', 'u');
      
          List<Character> consonants = new ArrayList<>();
      
          for (char latter = 'a'; latter <= 'z'; latter++) {
              if(!vowels.contains(latter)) {
                  consonants.add(latter);
              }
          }
      
          final Random random = new Random();
      
          int vowelsRemain = 5;
          int consonantsRemain = 5;
      
          List<Character> result = new ArrayList<>();
      
          while (vowelsRemain > 0 && consonantsRemain > 0) {
              final boolean generateVowel = random.nextBoolean();
      
              final char randomLatter;
      
              if(generateVowel) {
                  randomLatter = vowels.get(random.nextInt(vowels.size()));
                  vowelsRemain--;
              } else {
                  randomLatter = consonants.get(random.nextInt(consonants.size()));
                  consonantsRemain--;
              }
      
              result.add(randomLatter);
          }
      
          while (vowelsRemain > 0) {
              final Character randomVowel = vowels.get(random.nextInt(vowels.size()));
              result.add(randomVowel);
      
              vowelsRemain--;
          }
      
          while (consonantsRemain > 0) {
              final Character randomConsonant = consonants.get(random.nextInt(consonants.size()));
              result.add(randomConsonant);
      
              consonantsRemain--;
          }
      
          System.out.println(result);
      

      【讨论】:

        猜你喜欢
        • 2021-08-07
        • 1970-01-01
        • 2018-07-26
        • 2021-12-16
        • 1970-01-01
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        • 2017-08-02
        相关资源
        最近更新 更多