3

我正在尝试编写一个程序,其中将单词作为字符串提供作为输入,我必须重新排列单词,以便通过将所有元音移动到末尾来改变单词中字母的顺序,保持它们的顺序与它们在原始单词中出现的顺序相同

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string word = "application";
            char[] letters = word.ToCharArray();
            char x = new char { };
            for (int j = 0; j < letters.Length; j++)
            {
                if ((letters[j] == 'a') | (letters[j] == 'e' ) | (letters[j] == 'i' ) | (letters[j] == 'o' ) | (letters[j] 

== 'u'))
                {
                    for (int i = 0; i < letters.Length - 1; i++)
                    {
                        x = letters[i];
                        letters[i] = letters[i + 1];
                        letters[i + 1] = x;
                    }
                }
            }
            string s = new string(letters);
            Console.WriteLine(s);
        }
    }
}

程序的输出是

ationaplic

但程序的预期输出是

pplctnaiaio

为什么我的代码没有产生我想要的输出?

编辑后的工作代码是

namespace VowelSort
{
    class Program
    {
        static void Main(string[] args)
        {
            string word = "application";
            char[] letters = word.ToCharArray();
            char x = new char { };
            int count = 0;
            for (int j = 0; j < letters.Length - count; j++)
            {
                if ((letters[j] == 'a') | (letters[j] == 'e') | (letters[j] == 'i') | (letters[j] == 'o') | (letters[j] == 'u') | (letters[j] == 'A') | (letters[j] == 'E') | (letters[j] == 'I') | (letters[j] == 'O') | (letters[j] == 'U'))
                {
                    for (int i = j; i < letters.Length - 1; i++)
                    {
                        x = letters[i];
                        letters[i] = letters[i + 1];
                        letters[i + 1] = x;

                    }
                    count++;
                    j--;
                }

            }
            string s = new string(letters);
            Console.WriteLine(s);
            Console.WriteLine(count);
        }
    }
}
4

4 回答 4

6

我在这里发现了三个问题:

  1. 当你找到一个元音时,你开始你的内部循环,0所以你总是将第一个字符移动到末尾。j改为开始。
  2. 在你移动了一个元音之后,你从下一个字母开始你的外循环——所以如果你连续有两个元音,你跳过第二个(因为它已经被移动到他“当前”位置之后)。在你之后重新完成移动元音,减量j
  3. 您将外部循环运行到最后,但是当您到达已经移动的元音时,您应该停止它。记录你移动的元音数量,当你从最后到达那么多字符时停止你的外循环。

尝试自己实施这些更改,但如果您遇到困难,我可以给您一些指示。

完成这项工作后,您可能希望通过意识到不必执行多次成对交换来加速内部循环 - 您只需记下您找到的元音,将其后的所有内容向上移动一个字符,然后插入最后的元音。

于 2013-01-09T08:44:38.803 回答
3

static char[] vowels = new char[] { 'a', 'e', 'i', 'o', 'u' };

使用这个 LINQ 查询:

string s = "absdiuoc";
string result = string.Concat(s.ToCharArray()
                                .GroupBy(c => vowels.Contains(c))
                                .OrderBy(g => g.Key)
                                .SelectMany(g => g));
于 2013-01-09T08:39:58.687 回答
2

使用简单的 LINQ 查询:

word = String.Concat(word.OrderBy(c => "aeiou".Contains(c)));
于 2013-01-09T08:41:37.837 回答
1

当您的代码识别出一个元音时,它会将其移动到数组的末尾(从而将所有字母向左移动一个空格)。但是,您的外部循环仍在移动到下一个字符,这意味着如果有连续的元音,您将错过一个元音:

例如,考虑“空气”这个词。当变量i为 0 时,'a' 移到末尾:

air
^ i=0

i现在在索引零处增加到 1 缺少“i”:

ira
 ^ i=1

(您还需要确保外循环在到达已移动的元音之前停止。)

于 2013-01-09T08:45:38.030 回答