根据层次结构在列表中搜索字符串

时间:2017-03-02 19:54:22

标签: c# .net vba algorithm

我有一个预定的字符串层次结构,并希望返回在层次结构中排名较高的字符串,其中一些字符串是另一个字符串的子字符串。对于例如“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 之前列出

解决此类问题的最佳方法是什么?

3 个答案:

答案 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)