按特异性对通配符匹配项进行排序
本文关键字:排序 特异性 通配符 | 更新日期: 2023-09-27 18:36:55
给定一个字符串列表,如下所示:
a/b/*/lol/cats
*/*
foo/bar/**
foo/bar/*/C/**
您将如何按特异性对它们进行排序?
我的天真方法(适用于我的大多数测试用例)如下:
var sorted = wildCards
.OrderBy(c => c.HasCatchAll)
.ThenBy(c => c.NumWildCards)
.ThenByDescending(c => c.Pattern.Length);
在上面的代码中,HasCatchAll
属性指示字符串末尾有一个 **(** 的唯一有效位置)。
我对上述推理是,任何有**
的东西都不比没有通配符的通配符具体,而且你拥有的通配符越多,你的具体性就越低。也就是说,上述内容将失败:
*/hi/*/*
*/*/hi/*
任何帮助将不胜感激。
假设您有一个比较函数,那么为您的列表构建排序算法很容易。
问题是如何定义这样的函数。也许你可以这样定义它:
- 两个字符串作为输入 (a, b)
- 如果两个字符串相互匹配 => a == b
- 如果两个字符串彼此不匹配=>更精细的比较,比如你的 HasCatch 东西......
- 如果第一个字符串与第二个字符串匹配 => a
- 如果第二个字符串与第一个字符串匹配 => a> b
例如,匹配是:*
和foo
。在这里*
匹配foo
,但不是相反。
使用它,您可以覆盖案例
*/hi/*/*
*/*/hi/*
这将表示它们彼此匹配,这意味着它们具有相同的顺序。
长话短说:我不认为你的解决方案失败了。将这两个字符串定义为"相等"是有意义的,不是吗?
第二个想法:如果你在这样的字符串中优先考虑你的条目:1/2/3/4...你也可以规避你的问题..在这种情况下*/hi/*/*
更具体