3

次のような文字列のリストが与えられた場合:

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プロパティは、文字列の末尾に ** があることを示しています (** の唯一の有効な場所)。

上記の理由は、a を含む**ものはワイルド カードを含まないものよりも具体的でなく、ワイルド カードが多いほど具体的でなくなるということです。つまり、上記は次の場合に失敗します。

*/hi/*/*
*/*/hi/*

どんな助けでも大歓迎です。

4

1 に答える 1

1

比較関数があるとしましょう。リストのソート アルゴリズムを構築するのは簡単です。

問題は、そのような関数をどのように定義するかです。たぶん、次のように定義できます。

  • 入力としての 2 つの文字列 (a, b)
  • 両方の文字列が一致する場合 => a == b
  • 両方の文字列が互いに一致しない場合 => HasCatch のような、より複雑な比較...
  • 最初の文字列が 2 番目の文字列と一致する場合 => a < b
  • 2 番目の文字列が最初の文字列と一致する場合 => a > b

マッチングの例: *and foo. ここでは に*一致fooしますが、その逆ではありません。

これを使用して、ケースをカバーします

*/hi/*/*
*/*/hi/*

これは、両方が互いに一致していることを意味します。つまり、同じ順序であることを意味します。

簡単に言えば、あなたのソリューションが失敗するとは思いません。これら 2 つの文字列を「等しい」と定義するのは理にかなっていますね。

2 番目の考え: 1/2/3/4 などの文字列内のエントリに優先順位を付けると、問題を回避することもできます..その場合*/hi/*/*はより具体的です

于 2012-06-11T22:53:50.233 に答える