我正在研究一种执行以下操作的算法
我有两个List<String>
,说
List<String> A == {"20", "32A", "50K", "50F", "50D", "70", "72"}
List<String> B == {"20", "32A", "72"}
我想确保列表 B
是 A
的子集按照正确的顺序。
示例:
B == {"20", "32A", "72"}
应该返回true
B == {"20", "32A", "70"}
应该返回true
B == {"20", "32A", "40"}
应该返回false
(A
没有"40"
)B == {"32A", "20", "70"}
应该返回false
(A
有"20", "32A", "70"
订单)
最佳答案
让我们概括一下这个问题:如果有 IEnumerable<T>
是另一个 IEnumerable<T>
的有序子集(C#)。
代码(C#):
public static bool IsOrderedSubset<T>(IEnumerable<T> list,
IEnumerable<T> subset,
IComparer<T> comparer = null) {
if (null == comparer)
comparer = Comparer<T>.Default;
if (null == comparer)
throw new ArgumentNullException(nameof(comparer),
$"No default comparer for {typeof(T).Name}");
if (null == list || null == subset)
return false;
using (var enSubset = subset.GetEnumerator()) {
using (var enList = list.GetEnumerator()) {
while (enSubset.MoveNext()) {
while (true) {
if (!enList.MoveNext())
return false;
else if (comparer.Compare(enList.Current, enSubset.Current) == 0)
break;
}
}
}
}
return true;
}
演示:
List<string> A = new List<String>() {
"20", "32A", "50K", "50F", "50D", "70", "72"};
List<string>[] Bs = new List<string>[] {
new List<string>() { "20", "32A", "72"},
new List<string>() { "20", "32A", "70"},
new List<string>() { "20", "32A", "40"},
new List<string>() { "32A", "20", "70"},
};
var report = string.Join(Environment.NewLine, Bs
.Select(B => $"[{string.Join(", ", B)}] : {(IsOrderedSubset(A, B) ? "true" : "false")}"));
Console.Write(report);
结果:
[20, 32A, 72] : true
[20, 32A, 70] : true
[20, 32A, 40] : false
[32A, 20, 70] : false
关于java - 判断一个列表是否是另一个具有正确顺序的列表的有序子集的函数 c# 或 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59938131/