【问题标题】:search for a string in a list based on a hierarchy根据层次结构在列表中搜索字符串
【发布时间】:2017-03-02 19:54:21
【问题描述】:

我有一个预定的字符串层次结构,想返回层次结构中排名较高的字符串,其中一些字符串是另一个字符串的子字符串。例如“abb”和“abb be”

层次结构 - abc de、abb be、ccdd、aab、abb、aabb、abc、ccde

我想根据层次结构中的顺序输出字符串

输入 - abb、aabb、ccdd
输出 - ccdd
对于上面的示例,输出应该是 ccdd,因为它在层次结构中列在 aabaabb 之前

这里还有一个例子-

输入 - abc、aabb、ccde
输出 - aabb
这里的输出应该是 aabb,因为它在层次结构中列在 abcccde 之前

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

【问题讨论】:

  • 首先我没有看到任何层次结构,而只是一个字符串列表,所以这听起来像是从另一个列表问题中按索引排序。第二,为什么第二个例子也没有返回ccdd(它在abcaabb之前)?
  • 同意 Ivan,我也会在第二个例子中返回 ccdd
  • 您尝试使用哪种语言来解决此问题? C# 中的“最佳方式”可能与 VBA 中的完全不同!
  • @IvanStoev 我更新了问题,ccdd 是印刷错误。层次结构列表中列出的顺序反映了层次结构
  • 所以问题可以定义为:从预定义的列表中找到索引最小的输入元素。您可以通过多种方式处理它,包括简单的for 循环,以防输入相对较小。

标签: c# .net vba algorithm


【解决方案1】:

在 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);

【讨论】:

    【解决方案2】:

    您可以在每个输入上通过排名列表来确定排名,但我会首先将排名列表转换为字典。之后,您可以按排名对您的输入进行排序并获得第一个:

    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();
    

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多