我有一个预定的字符串层次结构,并希望返回在层次结构中排名较高的字符串,其中一些字符串是另一个字符串的子字符串。对于例如“abb”和“abb be”
层次结构 - abc de,abb be,ccdd,aab,abb,aabb,abc,ccde
我想根据层次结构中的顺序输出字符串
输入 - abb,aabb,ccdd
输出 - ccdd
对于上面的示例,输出应该是 ccdd ,因为它在层次结构 aab 和 aabb 之前列出
这是另一个例子 -
输入 - abc,aabb,ccde
输出 - aabb
这里的输出应该是 aabb ,因为它在层次结构 abc 和 ccde 之前列出
解决此类问题的最佳方法是什么?
答案 0 :(得分:2)
C#中最有效的方法是将输入转换为HashSet
,然后在预定义列表上使用正向循环或LINQ,并返回第一个匹配元素。
例如:
var ordered = new List<string> { "abc de", "abb be", "ccdd", "aab", "abb", "aabb", "abc", "ccde" };
var input = new List<string> { "abb", "aabb", "ccdd" };
// LINQ solution
var result = ordered.FirstOrDefault(new HashSet<string>(input).Contains);
答案 1 :(得分:1)
你可以在每个输入上通过排名列表来确定排名,但我会首先将排名列表转换为字典。之后你可以在排名上订购你的输入并取第一个:
var rank = new List<string> { "abc de", "abb be", "ccdd", "aab", "abb", "aabb", "abc" };
var rankDict = rank.Select((i, s) => new { i, s }).ToDictionary(x => x.i, x => x.s);
var input = new List<string> { "abb", "aabb", "ccdd" };
var result = input.OrderBy(s => rankDict[s]).FirstOrDefault();
如果并非所有来自输入的字符串都显示在排名列表中,您可以将它们排在最低优先级:
var result = input.OrderBy(s => rankDict.ContainsKey(s)?rankDict[s]:Int32.MaxValue).FirstOrDefault();
答案 2 :(得分:1)
Dim arrOrder, arrTest, m
arrOrder = Array("abc de", "abb be", "ccdd", "aab", "abb", "aabb", "abc")
arrTest = Array("abb", "aabb", "ccdd")
m = Application.Evaluate("=MIN(IFERROR(MATCH({""" & Join(arrTest, """,""") & """}," & _
"{""" & Join(arrOrder, """,""") & """},0),999999))")
Debug.Print arrTest(m - 1)