簡體   English   中英

如何在一個用戶定義的函數中創建自己的 String.Split() 和 Array.Reverse() 內置函數來反轉給定的字符串?

[英]How do I make my own String.Split() and Array.Reverse() built-in functions in one user-defined function to reverse a given string?

我試過這個:

using System;
using System.Collections;
using System.Collections.Generic;

public class HelloWorld
{
    public static string reverseWords(string str){
        ArrayList strArr = new ArrayList();
        int start = 0;
        string revStr = "";
        for(int i = 0; i < str.Length; i++){ 
            if(str[i] == ' '){               // if there's a space,
                while(start <= str[i - 1]){  // loop thru the iterated values before space
                    strArr.Add(str[start]);  // add them to the ArrayList
                    start++;                 // increment `start` until all iterated values are-
                }                            // stored and also for the next word to loop thru
            }
        }
        for(int j = strArr.Count - 1; j >= 0;  j--){
            revStr += strArr[j] + " ";             // keep appending ArrayList values to the-
        }                                          // string from the last to the first value
        return revStr;
    }
    
    public static void Main(string[] args)
    {
       Console.WriteLine(reverseWords("Our favorite color is Pink"));
       //Expected output : Pink is color favorite Our 
    }
}

它給出了這個錯誤:

System.IndexOutOfRangeException: Index was outside the bounds of the array.

請幫助我理解為什么這不起作用。 而且,如果有更好的方法來手動執行此 ReverseWord 函數(根本不使用任何內置函數)。

如果這是一個菜鳥問題,我很抱歉。 任何建設性的批評都是值得贊賞的。 謝謝!

這是您的代碼的一個稍微改進的版本,它實際上適用於您願意做的事情。

using System;
using System.Collections;

public class HelloWorld
{
    public static string reverseWords(string str){
        ArrayList strArr = new ArrayList();
        string currentWordString = string.Empty; 
        string revStr = string.Empty;
        for(int i = 0; i < str.Length; i++){ 
            if(str[i] == ' '){               // if there's a space,
                strArr.Add(currentWordString); // add the accumulated word to the array
                currentWordString = string.Empty; // reset accumulator to be used in next iteration
            }else {
                currentWordString += str[i]; // accumulate the word
            }
        }
        
        strArr.Add(currentWordString); // add last word to the array
        
        
        for(int j = strArr.Count - 1; j >= 0;  j--){
            revStr += strArr[j] + " ";             // keep appending ArrayList values to the-
        }                                          // string from the last to the first value
        return revStr;
    }
    
    public static void Main(string[] args)
    {
       Console.WriteLine(reverseWords("Our favorite color is Pink"));
       //Expected output : Pink is color favorite Our 
    }
}

我會讓你做剩下的。 就像刪除句子末尾的訓練空間一樣。 添加空格以外的分隔符(例如逗號、分號...)

["

 "Our favorite color is Pink".Split('\u0020').Reverse().ToList().ForEach(x =>
  {
      Console.WriteLine(x);
  });

這將有助於

    public static string ReverseCharacters(string str)
    {
        if(str == null)
        {
            throw new ArgumentNullException(nameof(str));
        }

        int lastIndex = str.Length - 1;
        char[] chars = new char[str.Length];

        char temp;
        for(int i = 0; i < str.Length/2+1; i++)
        {
            // Swap. You could refactor this to its own method if needed
            temp = str[i];
            chars[i] = str[lastIndex - i];
            chars[lastIndex - i] = temp;
        }

        return new string(chars);
    }

    public static string ReverseWords(string str)
    {
        if (str == null)
        {
            throw new ArgumentNullException(nameof(str));
        }

        if (string.IsNullOrWhiteSpace(str))
        {
            return str;
        }

        string space = " ";
        StringBuilder reversed = new StringBuilder();
        // reverse every characters
        var reversedCharacters = ReverseCharacters(str);
        // split words (space being word separator here)
        var reversedWords = reversedCharacters.Split(space);
        // for every revered word characters, reverse it back one more time and append.

        foreach(var reversedWord in reversedWords)
        {
            reversed.Append(ReverseCharacters(reversedWord)).Append(space);
        }

        // remove last extra space
        reversed = reversed.Remove(reversed.Length - 1, 1);

        return reversed.ToString();
    }

這是測試結果:

在此處輸入圖像描述

暫無
暫無

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

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