लोग! मेरे पास यह स्थिति है: एक स्ट्रिंग और दो और वर्ण एक्स और वाई को देखते हुए। सभी एक्स वर्णों को स्ट्रिंग की शुरुआत में और सभी वाई वर्णों को स्ट्रिंग के अंत में ले जाएं। स्ट्रिंग में अन्य वर्णों का क्रम अपरिवर्तित रहता है। मैंने X को बाईं ओर और Y को दाईं ओर ले जाने के लिए दो फ़ंक्शन MoveCharsLeft और MoveCharsRight लिखे, लेकिन एक त्रुटि है System.IndexOutOfRangeException: 'इंडेक्स बाहर था कोड की इस पंक्ति पर 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;
    }
0
user14287064 14 अक्टूबर 2020, 15:33

2 जवाब

सबसे बढ़िया उत्तर

आप अपनी सीमाओं की जाँच नहीं कर रहे हैं। मैं कहूंगा कि CheckChars विधि बेमानी है और MoveCharsLeft और MoveCharsRight में आप जांच नहीं कर रहे हैं कि आप अभी भी 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 और फिर MoveCharactersRight को MoveCharsLeft के परिणाम पर कॉल करें।

0
Shadowchaser 14 अक्टूबर 2020, 16:59

आप उन्हें जगह-जगह स्वैप कर सकते हैं, हालाँकि इसके लिए बहुत अधिक प्रतिलिपि बनाने की आवश्यकता होती है। एक सरणी में एक चरित्र को एक स्थान से दूसरे स्थान पर ले जाने के लिए यहां एक फ़ंक्शन है। आप इसके कई उदाहरण वेब और 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));
    }

सामान्य चेतावनी लागू होती है - इसका अच्छी तरह से परीक्षण नहीं किया गया है और यदि आप इसका उपयोग करते हैं, तो आपको सभी किनारे के मामलों की जांच करनी चाहिए।

0
MikeJ 14 अक्टूबर 2020, 17:01