-1

カスタムロジックを使用して並べ替えたい配列があります。

new string[] {"bRad", "Charles", "sam", "lukE", "vIctor"}

ここで、文字列内の大文字の位置に応じてこれを並べ替えたいと思います。最初の文字が大文字の場合、他の文字は無視します。2 つの文字列の大文字が同じ位置にある場合は、アルファベット順に並べ替えます。文字列に大文字がない場合は、明らかにリストの最後に移動します。パフォーマンスは重要な要素です。これをテストする膨大な量のデータが必要になります。

出力は

new string[] {"Charles", "vIctor", "bRad", "lukE", "sam"} 

説明:

Charles最初の位置に大文字があるため、最初に来ます。
vIctor2 番目の位置に大文字があるため 2 番目になります 2 番目の位置
bRad に大文字があるため 3 番目になりますがI
lukE 、4 番目の位置に大文字があるため最初に来
samます。

私は .NET 2.0 に制限されています。助けてください。

4

3 に答える 3

1

問題は、いくつかの小さな個別の部分に分割できます。まず、首都を特定する必要があります。これは、RegExを使用して実行できます。

Regex rg = new Regex("[A-Z]");
MatchCollection mc = rg.Matches(crazyString);

http://professionalaspnet.com/archive/2009/10/01/Parsing-Capital-Letters.aspx

次に、ソートを行う関数を作成する必要があります。大文字を見つけるには、各文字列に対して正規表現を実行する必要があります。次に、大文字を比較して並べ替えます。

IComparableOOPを使用してこれを実行する場合は、インターフェイスhttp://support.microsoft.com/kb/320727を実装するクラスを作成する必要があります。

public MyClass : IComparable
{
  int IComparable.CompareTo(object obj)
  {
  }
}
于 2012-04-22T16:52:53.423 に答える
1

このためにIComparerを訴えることをお勧めします。独自のクラスに実装し、並べ替えのための独自のカスタムロジックを提供できます。これを行うには、Array.Sort()メソッド呼び出しでComparerを指定します:http://msdn.microsoft.com/en-us/library/aw9s5t8f.aspx

于 2012-04-22T16:53:41.510 に答える
1

パフォーマンスへのアプローチは次のとおりです。大文字化規則に従うカスタム比較演算子を使用できます。速度のために、使用しているアルファベットのサイズ (ASCII の単純なケースでは 26 個の異なる大文字) の 2 つの整数配列を使用して、大文字の文字数を追跡できます。両方の単語が等しい場合は、文字列自体を比較できます。

public class CapitalizerComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        int[] xCount = new int[26];
        int[] yCount = new int[26];

        foreach(char c in x)
        {
            if (char.IsUpper(c))
                xCount[c-'A']++;
        }

        foreach (char c in y)
        {
            if (char.IsUpper(c))
                yCount[c-'A']++;
        }

        for (int i = 0; i < xCount.Length; i++)
        {
            if(xCount[i] > yCount[i])
                return -1;
            else if(yCount[i] > xCount[i])
                return 1;
        }
        return x.CompareTo(y);
    }
}

あなたの規則によれば、大文字の文字の位置は無関係なので、決定を下すには両方の単語のすべての文字を調べる必要があります。したがって、上記のアルゴリズムは最適であり、O(n+m) である必要があります。

//use case:
var input = new string[] { "bRad", "Charles", "sam", "lukE", "vIctor" };
Array.Sort(input, new CapitalizerComparer());

出力:

Charles
lukE
vIctor
bRad
sam
于 2012-04-22T16:58:16.733 に答える