-1

入力値はAからZZZ(アルファベットのみ、数字なし)にすることができます。fromフィールドとtoフィールドを検証するにはどうすればよいですか。

入力がAまたはAAまたはAAAである場合

  • B> A
  • BB> A
  • BBB> A
  • BBB <B
  • BBB <BB
  • DD> Cですが、Dは<である必要がありますCCは辞書式順序ではないため、失敗します

fromの長さがtoの長さよりも短い場合は常に短くなるため、最初に長さを確認することを考えていました。長さが等しい場合は、アルファベット順のチェック。それから私は動けなくなります。

単純な辞書式順序ではありません。3つの可能なグループが、アルファベット順だけでなく、シングル、ダブル、トリプル文字のシングルグループがダブルおよびトリプルグループより低く、ダブルがトリプルグループより低くなっているためです。

4

4 に答える 4

1

正規表現の使用について考えたことはありますか?\b[A-Z]{1,3}\b

于 2013-01-21T12:55:32.177 に答える
0
string from = "BB";
string to = "AAA";
bool valid = string.Compare(from, to) < 0; // false

したがって、辞書式順序ですでに機能します。デモ

于 2013-01-21T12:55:30.793 に答える
0

あなたは正しい方向に進んでいます。最初に長さをチェックするカスタム比較子を作成します。例えば:

public class MyComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (x.Length < y.Length) return -1;
        if (x.Length > y.Length) return 1;
        return Comparer.Default.Compare(x, y);
    }
}
于 2013-01-21T14:28:48.127 に答える
0

次のことができます: A*26^2 + A*26^1 + A*26^0 という文字列 AAA を数値として想像してください。

(26 進法、文字数が多いため)

文字列を分割し、値 A から Z を 1 から 26 にキャストします (前の空白 = 0)。これで完了です。

 A = 0*26^2 + 0*26^1 + 1*26^0 => 1
 B = 2 => 2
 ...
 Z = 26 => 26
 AA = 1 * 26^1 + 1 => 27
 ...
 ZZ = 26*26^1 + 26 = 702
 ...
 ZZZ = 26*26^2 + 26*26^1 + 26 => 18278 

ラップする

    public int LetterCodeToInt(String LetterCode)
    {
        //fill up whitespaces in front.
        String s = LetterCode.PadLeft(3, '_').ToUpper();

        int value = 0;
        int k = s.Length -1;
        for (int i = 0; i < s.Length; i++)
        {
            if (s[i] != '_')
            {
                //ASCII "A" is 65, subtract 64 to make it "1" 
                value += (((int)s[i]) - 64) * Convert.ToInt32(Math.Pow(26, k));
            }
            k--;
        }
        return value;
    }

そして、次のことができます:

 if (LetterCodeToInt("AAA") > LetterCodeToInt("AZ")){

 }
于 2013-01-21T13:01:31.597 に答える