【问题标题】:How to move chars in char array to the left and to the right in c# sharp如何在c#中将char数组中的字符向左和向右移动
【发布时间】:2020-10-14 12:33:54
【问题描述】:

伙计们!我有这种情况:给定一个字符串和另外两个字符 X 和 Y。将所有 X 字符移到字符串的开头,将所有 Y 字符移到字符串的末尾。字符串中其他字符的顺序保持不变。 我写了两个函数 MoveCharsLeftMoveCharsRight 将 X 向左移动和 Y 向右移动,但是有一个错误 System.IndexOutOfRangeException: 'Index was outside the数组的边界。' 在这行代码 char toReplace = splitText[charToCheck]; 我不知道如何处理它,以解决练习。 各位大神能帮我看看,功能应该是怎样的?

static void Main()
    {
        string text = Console.ReadLine();
        char[] splitText = text.ToCharArray();
        string firstLetter = Console.ReadLine();
        char[] firstChar = firstLetter.ToCharArray();
        string secondLetter = Console.ReadLine();
        char[] secondChar = secondLetter.ToCharArray();
        char one = firstChar[0];
        char two = secondChar[0];
        Console.WriteLine(CheckChars(splitText, one, two));
        Console.ReadLine();
    }

    static char[] CheckChars(char[] splitText, char one, char two)
    {
        for (char letter = 'a'; letter <= 'z'; letter++)
        {
            if (Array.IndexOf(splitText, one) > -1)
            {
                MoveCharsLeft(splitText, one);
            }

            if (Array.IndexOf(splitText, two) > -1)
            {
                MoveCharsRight(splitText, two);
            }
        }

        return splitText;
    }

    static void MoveCharsLeft(char[] splitText, char charToCheck)
    {
        char toReplace = splitText[charToCheck];
        char currentLetter = splitText[0];
        for (int i = 0; i <= charToCheck; i++)
        {
            char temporary = splitText[i];
            splitText[i] = currentLetter;
            currentLetter = temporary;
        }

        splitText[0] = toReplace;
    }

    static void MoveCharsRight(char[] splitText, char charToCheck)
    {
        char toReplace = splitText[charToCheck];
        char currentLetter = splitText[-1];
        for (int i = 0; i <= charToCheck; i++)
        {
            char temporary = splitText[i];
            splitText[i] = currentLetter;
            currentLetter = temporary;
        }

        splitText[-1] = toReplace;
    }

【问题讨论】:

    标签: c# arrays string char swap


    【解决方案1】:

    你没有检查你的界限。我想说CheckChars 方法是多余的,在MoveCharsLeftMoveCharsRight 中,你没有检查你是否还在splitText 中。

    以下是我将如何实现MoveCharsLeft,希望它能引导您朝着正确的方向前进。

    char[] MoveCharactersLeft(char[] text, char character) {
        var lowerCharacter = char.ToLower(character);
        var left = new List<char>();
        var right = new List<char>();
        
        foreach (var letter in text) {
            if (char.ToLower(letter) == lowerCharacter) {
                left.Add(letter);
                continue;
            }
            
            right.Add(letter);
        }
        
        left.AddRange(right);
        return left.ToArray();
    }
    

    这里是MoveCharactersRight

    char[] MoveCharactersRight(char[] text, char character) {
        var lowerCharacter = char.ToLower(character);
        var left = new List<char>();
        var right = new List<char>();
        
        foreach (var letter in text) {
            if (char.ToLower(letter) == lowerCharacter) {
                right.Add(letter);
                continue;
            }
            
            left.Add(letter);
        }
        
        left.AddRange(right);
        return left.ToArray();
    }
    

    现在您已经拥有两者,您只需调用MoveCharsLeft,然后在MoveCharsLeft 的结果上调用MoveCharactersRight

    【讨论】:

    • 感谢您的解决方案,它适用于第一个用户的角色,但我认为您错过了我们从用户那里获得第二个角色(Y)的部分,它应该移到右边: 将所有 X 字符移到字符串的开头,将所有 Y 字符移到字符串的末尾。你也可以帮我吗?我在c#中看到负索引不存在。
    • 你只需要修改两行就可以了,但是好的,我现在已经添加了。
    【解决方案2】:

    您可以将它们就地交换,尽管这需要大量复制。这是一个将字符从数组中的一个位置移动到另一个位置的函数。你可以在网上和SO找到几个这样的例子。

        public static void Move(char[] buffer, int from, int too)
        {
            if (from == too)
                return;
    
            char temp = buffer[from];
    
            if (too < from)
            {
                Array.Copy(buffer, too, buffer, too + 1, from - too);
            }
            else
            {
                Array.Copy(buffer, from + 1, buffer, from, too - from);
            }
    
            buffer[too] = temp;
        }
    

    然后你只需要遍历数组来测试字符,测试它们并将它们移动到正确的位置。这是一个函数:

        public static void ArrangeChars(char[] buffer, char left, char right)
        {
            int leftIndex = 0;
            int rightIndex = buffer.Length - 1;
    
            int i = 0;
    
            while(i <= rightIndex)
            {
                char ch = buffer[i];
    
                if (ch == left && i > leftIndex)
                    Move(buffer, i, leftIndex++);
                else if (ch == right && i < rightIndex)
                    Move(buffer, i, rightIndex--);
                else
                    ++i;
            }
        }
    

    这样称呼它:

        static void Main(string[] _)
        {
            char[] data = "test me and move".ToCharArray();
    
            Console.WriteLine(new string(data));
    
            ArrangeChars(data, 'e', 't');
    
            Console.WriteLine("Move 'e' to start, move 't' to end");
    
            Console.WriteLine(new string(data));
        }
    

    通常的警告适用 - 这还没有经过很好的测试,如果你使用它,你应该检查所有的边缘情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多