我正在嘗試實作一個簡單的霍夫曼編碼演算法。我使用我的輸入字串 (ddddbbcccaeeeee) 并使用它來創建 2 個陣列,它們是一個稱為 char 陣列usedCharacters和一個稱為characterCounts. 然而,這些陣列需要按字符在輸入字串中出現的次數進行排序,這樣才能構建霍夫曼樹。我嘗試使用 LINQ 的 OrderByDescending() 方法,就像我在網上看到的那樣:
usedCharacters = usedCharacters.OrderByDescending(i => characterCounts).ToArray();
characterCounts = characterCounts.OrderByDescending(i => i).ToArray();
程式運行,但是當我檢查結果時,字符顯然仍然按順序出現在輸入字串中,這意味著實際上沒有進行排序。另一方面,characterCounts確實成功排序。我還嘗試了更常見的在線解決方案,usedCharacters.OrderByDescending(i => characterCounts.IndexOf(i)).ToArray()但由于我不完全理解的原因,這只會導致索引越界例外。如果有人可以讓我深入了解我所缺少的東西,那將不勝感激。謝謝!
uj5u.com熱心網友回復:
實作您想要做的最簡單的方法是使用GroupBy運算式。
var s = "ddddbbcccaeeeee";
var list = s.GroupBy(x => x)
.Select(x => new { Char = x.Key, Count = x.Count() })
.OrderByDescending(x => x.Count);
foreach(var item in list)
{
Console.WriteLine(item.Char " " item.Count);
}
該代碼將s其視為字符陣列并計算所有字符的實體。然后OrderByDescending按 排序Count。
下面代碼的輸出應如下所示:
e 5
d 4
c 3
b 2
a 1
uj5u.com熱心網友回復:
您的 LINQ 陳述句正在嘗試usedCharacters按常量對每個元素進行排序int[]。它不會像匹配兩個陣列的元素那樣做任何事情。就好像你正在這樣做:
usedCharacters = usedCharacters.OrderByDescending(i => 42).ToArray();
它只是以相同的順序離開陣列。
如果您有兩個單獨的串列,并且您想根據第二個串列訂購第一個,那么您需要Zip像這樣使用:
usedCharacters =
usedCharacters
.Zip(characterCounts)
.OrderByDescending(x => x.Second)
.Select(x => x.First)
.ToArray();
如果您有初始字串,那么這是獲得結果的最簡單方法:
string characters = "ddddbbcccaeeeee";
char[] usedCharacters =
characters
.GroupBy(x => x)
.OrderByDescending(x => x.Count())
.Select(x => x.Key)
.ToArray();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/531689.html
標籤:C#林克排序
