在這里遇到一個問題,我想我可能已經盯著太久了,我希望有人能指出我正確的方向。我一直在嘗試一些陣列操作,我覺得我已經接近了一些方法,但還沒有到達那里。
我所追求的是:給定一個值陣列(在本例中,我將使用簡單的值'A', 'B', 'C', 'D'),以及每個值所需的最少出現次數,以及對這些具有所需大小的值的集合進行分組的能力。例如:
// when given this list of required amounts
var config = new[] {
{ Value: 'A', AmountRequired: 1 },
{ Value: 'B', AmountRequired: 2 },
{ Value: 'C', AmountRequired: 3 },
{ Value: 'D', AmountRequired: 4 }
};
// and this array of values (matches requirements exactly)
var values = new[] { 'A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D' };
// the logic would return
var results = [
['A'],
['B', 'B'],
['C', 'C', 'C'],
['D', 'D', 'D', 'D'],
];
// this array of values (with one extra of each value) would also return the same result
// because there aren't enough added values for a second combined group
var values = new[] { 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'D' };
最容易描述該行為的用例可能就像一個視頻游戲制作選單,您會在其中看到類似“您需要 1 個 A、2 個 B、3 個 C 和 4 個 D 才能制作此專案”之類的內容,所以您'感興趣的是你有多少完整的這些值,任何備件都可以忽略。
我已經嘗試過使用Linq,并且當所有欄位的所需數量相同時,我讓它作業,這顯然不會滿足所有用例。我不打算在這里發布我的代碼嘗試,因為我希望對這個問題有一個新的看法,但如果它有幫助,我可以讓它可用。
提前致謝,
標記
uj5u.com熱心網友回復:
這個答案是基于這樣的假設,即結果可以簡單地是完整集的計數。
我建議從創建源陣列內容的概述開始:每個字符出現多少次?進行此類概述的一個好工具是字典。
首先,需要對源陣列中的值進行分組。然后,可以基于這些組創建字典。每個字符的鍵KeyValuePair是字符,值是該字符的出現次數:
var countPerChar = values
.GroupBy(_ => _)
.ToDictionary(
charGroup => charGroup.Key,
charGroup => charGroup.Count());
如果您的源陣列是這樣的:
var values = new[] { 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'D' };
,然后countPerChar看起來像這樣:
然后,我將創建一個字典來存盤每個 char 的完整集數。這個字典應該包含盡可能多的條目config(并且所有的鍵都config應該存在)。
對于 中的每個條目config,我會嘗試從中獲取目標 char 的值countPerChar。
如果存在目標char countPerChar,則可以將關聯的char計數除以所需的數量,以獲得完整的目標char集。
如果目標 char 中不存在countPerChar,則目標 char 的完整集是0。
var completeSetsPerChar = new Dictionary<char, int>();
foreach (var entry in config.Where(c => c.AmountRequired > 0))
{
countPerChar.TryGetValue(entry.Value, out int charCount);
completeSetsPerChar[entry.Value] = charCount / entry.AmountRequired;
}
現在,要獲得完整集的計數,您只需取每個 char 的所有完整集的最小值:
var completeSets = completeSetsPerChar.Values.Min();
示例小提琴在這里。
uj5u.com熱心網友回復:
我還有一個解決方案可以告訴你一組是否完整:
// when given this list of required amounts
var config = new[] {
new { Value= 'A', AmountRequired= 1 },
new { Value = 'B', AmountRequired= 2 },
new { Value = 'C', AmountRequired = 3 },
new { Value= 'D', AmountRequired= 4 }
};
// and this array of values (matches requirements exactly)
var values = new[] { 'A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D' };
var res =
from cfg in config
select (new { cfg.Value, setComplete = (values.Count(x => x == cfg.Value) >= cfg.AmountRequired) });
res.ToList().ForEach(x => Console.WriteLine(x));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523787.html
