2012-10-04 48 views
1

我想「增長」一個字符串到所需的長度(即「ABCDE」,所需的長度7,填充後變成「 - ABCDE」,「-A- BCDE「,」 - AB-CDE「,......,」ABCDE--「)。如何「成長」一個字符串到想要的長度

當我試圖使用以下代碼將「ABCDEFGH」填充到長度16時,代碼將永久運行。

/// <summary> 
    /// Pad a str to desired length 
    /// </summary> 
    /// <param name="s"></param> 
    /// <param name="length"></param> 
    /// <param name="pad"></param> 
    /// <param name="Padded"></param> 
    public static void PadToLength(string s, int length, char pad, ref List<string> Padded) 
    { 
     if (s.Length == length) 
     { 
      Padded.Add(s); 
      return; 
     } 
     else if (s.Length > length) 
     { 
      return; 
     } 
     else 
     { 
      List<int> pos = GetExceptPos(s, pad.ToString()); 
      pos.Sort(); 

      int count = -1; 
      foreach (int p in pos) 
      { 
       count++; 

       // Pad left 
       string leftPadStr = s.Substring(0, p) + pad + s.Substring(p); 
       PadToLength(leftPadStr, length, pad, ref Padded); 

       // Pad right at the last pos 
       if (count == pos.Count - 1) 
       { 
        string rightPadStr = s + pad; 
        PadToLength(rightPadStr, length, pad, ref Padded); 
       } 
      } 
     } 
    } 

     /// <summary> 
    /// Find indexes for elements different from target str 
    /// </summary> 
    /// <param name="str"></param> 
    /// <param name="excludeStr"></param> 
    /// <returns></returns> 
    private static List<int> GetExceptPos(string str, string excludeStr) 
    { 
     List<int> allIndexes = new List<int>(); 
     for (int i = 0; i < str.Length; i++) 
     { 
      allIndexes.Add(i); 
     } 

     return allIndexes.Except(str.IndexesOf(excludeStr)).ToList(); 
    } 

任何建議將不勝感激。謝謝。

+3

這是不完全填充的字符串 - 它看起來像要拿出的長度爲N的所有排列,使用連字符和有序的字符集? –

+0

*代碼永遠運行* - 請使用逐步執行來找出哪部分代碼導致無限循環/遞歸。在這一點上觀察變量值也可以幫助您找到問題的實際原因。 –

+0

@RJLohan是正確的。你想達到什麼目的?填充意味着在字符串的末尾添加一個「填充」字符,以使字符串等於一定的長度。你似乎在尋找所有可能的組合。 – Icemanind

回答

0

完成什麼@VRC上面說的,使用下面的代碼:

static void Main(string[] args) 
    { 
     var z = GetPermutations("ABCDEFGH", '-', 16); 

     foreach (string s in z) 
      Console.WriteLine(s); 

     Console.ReadKey(); 
    } 

    private static List<string> GetPermutations(string originalString, char padChar, int length) 
    { 
     if (length <= originalString.Length) 
      return null; 

     var list = new List<string>(); 
     int originalLength = originalString.Length; 
     int ndx = 0; 
     string beginString = originalString.PadLeft(length, padChar); 
     string endString = originalString.PadRight(length, padChar); 
     int lenDifference = endString.Length - originalString.Length; 

     list.Add(beginString); 
     while (lenDifference > 0) 
     { 
      while (ndx < originalLength) 
      { 
       beginString = SwapCharacters(beginString, lenDifference + ndx - 1, lenDifference + ndx); 
       list.Add(beginString); 
       ndx++; 
      } 

      ndx = 0; 
      lenDifference--; 
     } 

     return list; 
    } 

    private static string SwapCharacters(string value, int position1, int position2) 
    { 
     char[] array = value.ToCharArray(); 
     char temp = array[position1]; 
     array[position1] = array[position2]; 
     array[position2] = temp; 
     return new string(array); 
    } 

要使用的代碼,只需調用GetPermutations()功能。將原始字符串,字符傳遞給「pad」和總長度。它將返回一個List<string>。您可以迭代列表以獲取所有字符串。

0

我在Windows應用程序中爲你寫的。
我已經把評論,所以它會很清楚。
如果沒有,那麼問我;)

private void button1_Click(object sender, EventArgs e) 
{ 
    //Starting Values 
    var paddingLength = 7; 
    var paddingCharacter = '-'; 
    var value = "ABCDE"; 

    //Create starting string value 
    var startValue = value.PadLeft(paddingLength, paddingCharacter); 

    //Create Char Array of string 
    var charArray = startValue.ToCharArray(); 

    //New List 
    var values = new List<String>(); 

    //Shifter and StartingShifter 
    Int32 shifter; 
    Int32 startingShifter; 
    shifter = startingShifter = (paddingLength - value.Length) - 1; 

    //Max Length of the Char array 
    var maxLength = charArray.Length-1; 

    //Total loops the for loop need to do 
    var totalLoops = value.Length * (paddingLength - value.Length)-1; 

    //Loop 
    for (int i = 0; i <= totalLoops; i++) 
    { 
     //Swap the Characters 
     SwapChar(charArray, shifter, shifter + 1); 

     //Add value into list 
     values.Add(new String(charArray)); 

     //Go on shifting or go to next character 
     if (shifter + 1 == maxLength) 
     { 
      //Change the Max 
      maxLength--; 

      //Next - 
      shifter = startingShifter = startingShifter - 1; 

      ////FailSafe 
      //if (shifter < 0) 
      //{ 
      // break; 
      //} 
     } 
     else 
     { 
      //Next Array Value 
      shifter++; 
     } 
    } 
    //Set value in textbox 
    textBox1.Text = String.Join(Environment.NewLine, values.ToArray()); 
} 

private static void SwapChar(Char[] array, int position1, int position2) 
{ 
    // 
    // Swaps elements in an array. Doesn't need to return a reference. 
    // 
    Char temp = array[position1]; // Copy the first position's element 
    array[position1] = array[position2]; // Assign to the second element 
    array[position2] = temp; // Assign to the first element 
} 
相關問題