簡體   English   中英

c# - 如何在c#Sharp中將char數組中的字符向左和向右移動

[英]How to move chars in char array to the left and to the right in c# sharp

伙計們! 我有這種情況:給定一個字符串和另外兩個字符 X 和 Y。將所有 X 字符移動到字符串的開頭,將所有 Y 字符移動到字符串的末尾。 字符串中其他字符的順序保持不變。 我寫了兩個函數MoveCharsLeftMoveCharsRight來將 X 向左移動,Y 向右移動,但是有一個錯誤System.IndexOutOfRangeException: 'Index was outside the bounds of the array。 ' 在這行代碼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;
    }

你沒有檢查你的界限。 我會說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();
}

現在你有了這兩個,你只需在MoveCharactersRight的結果上調用MoveCharsLeftMoveCharsLeft

您可以就地交換它們,盡管它需要大量復制。 這是一個將字符從數組中的一個位置移動到另一個位置的函數。 你可以在網上和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));
    }

通常的警告適用 - 這還沒有經過很好的測試,如果你使用它,你應該檢查所有的邊緣情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM