我想在洗掉espaces后根據數字(大小)分割一個字串,例如:
我有 "1254k 698 77 "大小 "3",我的方法應該回傳:
我的方法應該回傳:
我的方法應該回傳:
我的方法應該回傳
我有 "1254k 698 77" size "3" , 我的方法應該回傳 :
125
4k6
987
7
這是我的代碼,我有一個錯誤,這是指在i = 12的for回圈中,字串索引和長度必須參考一個位置:
public string Reshape()
{
string str = "1254k 698 7785"/span>;
str = str.Replace(" ", " ")。
int size = 3;
List<string> ListFormat = new List<string> ()。
for (int i = 0; i <= str.Length; i = size)
{
ListFormat.Add( str.Substring(i, size))。
}
string output = string.Join(Environment.NewLine, ListFormat.ToArray() )。
return output;
}
我想重構我的代碼,如果有一個更有效的方法可以做到這一點。
會有什么問題呢? 我
uj5u.com熱心網友回復:
你必須計算出每次迭代中還剩下多少個字符。SubString方法的第一個引數實際上意味著offset,第二個引數意味著take。也就是說,如果你的字串中沒有足夠的字符與offset和take相匹配,那么你將會遇到一個錯誤。
uj5u.com熱心網友回復:
在效率和重構方面,我提出這個解決方案。
你應該能夠用最多兩遍來構建結果,就像這樣:
你應該能夠用最多兩遍來構建結果:
string input = "1254k 698 7785"/span>。
int size = 3;
string spacer = Environment.NewLine;
// 假設沒有字符是空格,那么中間應該有(長度-大小)/大小的空格。
//所以總大小應該是length (spacer count * spacer length)
int maxResultSize = input.Length ((input.Length - size) / size) * spacer.Length)。
///初始化StringBuilder的容量,這樣它就不需要在我們的方法執行程序中被擴展。
StringBuilder resultBuilder = new StringBuilder(maxResultSize)。
int found = 0;
int i = 0;
do; do
{
//跳過空位。
while (input[i] == ' '/span> && i < input.Length) { i; }
// If we're at the end of the string, exit the loop.
if (i == input.Length) { break; }
//如果在上一個迭代中我們達到了一個最大尺寸的塊,那么
//我們應該在寫下一個字符之前加一個空格。
if (found == size)
{
found = 0;
resultBuilder.Append(spacer)。
}
//寫入字符,然后增加found和我們的位置。
resultBuilder.Append(input[i])。
found;
i;
}
while (i < input.Length)。
//建立一個字串。
string result = resultBuilder.ToString();
//寫到控制臺
Console.WriteLine(result)。
在第一遍中,我們附加了輸入字串的每個非空格字符和我們想要引入的換行。
第二遍是StringBuilder內部的.ToString()方法,并回傳結果字串。
uj5u.com熱心網友回復:
考慮一下下面這個更短的版本。
在洗掉空白后,我們運行一個for回圈來迭代格式化的輸入。通過用所需的塊大小來增加計數器,我們可以通過在每個塊的開始處踩點來安全地遍歷字串。我們使用String.Substring()方法來切割所需大小的塊。Math.Min()方法被用來確定是否有足夠的字符可以采取。當字符少于所需的大小時,Substring()將回傳輸入中剩下的任何字符(在你的例子中,就是最后的 "7")。
public string Reshape(string input。int size)。
{
var result = new StringBuilder()。
input = input.Replace(" ", " ")。
for (int i = 0; i < input.Length; i = size)
{
result.AppendLine(input.Substring(i, Math.Min(size, input.Length - i)))。
}
return result.ToString()。
}
另外,請記住,這可能會比@mecab95的解決方案執行得慢一些,因為我們將為每個子串呼叫Math.Min()方法。
uj5u.com熱心網友回復:
我在代碼中改變了什么,但我覺得我們可以重構這個方法:
我在代碼中改變了什么?
public string Reshape()
{
string str = "1254k 698 77"/span>。
str = str.Replace(" ", " ");
int size = 3;
int RemainString = str.Length;
StringBuilder Result = new StringBuilder()。
for (int i = 0; i <= str.Length; i = size)
{
if (RemainString >= size)
{
Result.AppendLine(str.Substring(i, size))。
RemainString -= size。
}
else if (RemainString != 0)
{
Result.AppendLine(str.Substring(i, RemainString))。
RemainString = 0;
}
}
return Result.ToString()。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/323081.html
標籤:
