C#按字串中的數字排序問題
在專案的開發中遇到這麼個問題,原本應該是按照丐幫1, 丐幫2, 丐幫3 ....
的順序進行排序的,這裡的順序卻成了 丐幫1, 丐幫10, 丐幫11...
問題:
在.net的framework框架中提供的排序方法, 如List<T>.Sort()方法,對字串進行排序時,如果字串中含有數字,則不會按數字大小進行排序。
解決方案:
為了序排序後的效果為我們想要的按字串中的數值排序,我們必須重寫字串的比較函式。
程式碼思路:
由於比較兩個字串時,是逐個比較字元,先從第一個字元開始比較,取出兩個字串中的第一個字元比較,如果比較結果是大於,則說明第一個字串大於第二個字串,如果小於,則說明第一個字串小於第二字串,如果等於,則比較兩個字串中的第二個字元。如果比到最後也是相等,則說明兩個字串一樣大,如果有一個字串要多一些字元,則這個字串在大一些。
我們改進這個演算法:在比較過程中如果發現數字,則先不進行比較,看下一個字元是否為數字,這個取出兩個字串中的數字,按數字的數值大小來進行比較。如果相等再取一個字元進行比較。
程式碼實現:(這裡的Team
為自定義的物件)
public class TeamNameComparer : IComparer<Team>
{
public int Compare(Team x, Team y)
{
if (x == null || y == null)
{
throw new ArgumentException("Parameters can't be null");
}
var nameA = x.Name as string;
var nameB = y.Name as string;
var arr1 = nameA.ToCharArray();
var arr2 = nameB.ToCharArray();
var i = 0;
var j = 0;
while (i < arr1.Length && j < arr2.Length)
{
if (char.IsDigit(arr1[i]) && char.IsDigit(arr2[j]))
{
string s1 = "", s2 = "";
while (i < arr1.Length && char.IsDigit(arr1[i]))
{
s1 += arr1[i];
i++;
}
while (j < arr2.Length && char.IsDigit(arr2[j]))
{
s2 += arr2[j];
j++;
}
if (int.Parse(s1) > int.Parse(s2))
{
return 1;
}
if (int.Parse(s1) < int.Parse(s2))
{
return -1;
}
}
else
{
if (arr1[i] > arr2[j])
{
return 1;
}
if (arr1[i] < arr2[j])
{
return -1;
}
i++;
j++;
}
}
if (arr1.Length == arr2.Length)
{
return 0;
}
else
{
return arr1.Length > arr2.Length ? 1 : -1;
}
}
}
修改後的排序為:
相關文章
- SQL Server 中將字串按數字排序SQLServer字串排序
- 字串轉數字的問題字串
- C#中如何按位元組數擷取字串?C#字串
- 字串排序問題字串排序
- 面試題:陣列按列排序的問題面試題陣列排序
- 對於數字或者字串有限的問題的處理字串
- 巧取字串中的數字字串
- Oracle學習系列—關於字元數字混合排序和中文排序的問題Oracle字元排序
- [iOS 取出字串中的數字]iOS字串
- PHP提取字串中的數字PHP字串
- PHP 字串陣列按照拼音排序的問題PHP字串陣列排序
- SQL 如何拆分字串中的數值後排序SQL字串排序
- 如何拆出字串中的數值並排序字串排序
- Excel表格如何按漢字的筆畫排序?Excel表格按漢字的筆畫排序的方法Excel排序
- C#字串轉換為數字的4種方法C#字串
- js面試題-找出字串中的數字,並替換為*JS面試題字串
- 抽取字串中數字的函式字串函式
- C# 中的數字分隔符 _C#
- 字串位元組數問題字串
- C# 校驗字串是否漢字、其他字元,數字或字元C#字串字元
- C#判斷一個字串是否是數字或者含有某個數字C#字串
- javascript中將數字轉為字串的方法JavaScript字串
- c++中數字和字串的轉換C++字串
- Awk 字串連線操作(字串轉數字,數字轉字串)字串
- C# JSON按key進行排序C#JSON排序
- 統計字串中數字個數,並將數字字串形式輸出字串
- 用C#呼叫C++DLL時的字串指標引數傳遞問題C#字串指標
- 刪除排序陣列中的重複數字排序陣列
- js 漢字陣列按拼音排序JS陣列排序
- linux shell中運算字元與數字的問題Linux字元
- OpenStack 介面開發中的排序問題排序
- 【冰山白皮書】JS中的布林 數字 字串JS字串
- JavaScript刪除字串中的非數字內容JavaScript字串
- PHP技術分享-提取字串中的數字PHP字串
- 提取字串中數字的程式碼例項字串
- ORACLE從字串中過濾出數字~~Oracle字串
- c# 對JSON字串排序(KEY/VALUE)C#JSON字串排序
- 第五章 字串專題 ---------------- 5.8 題解:將字串中按單詞翻轉字串