3

そのため、文字列の配列のように機能する単純な構造体を作成していますが、文字列で常に見たいと思っていたいくつかの便利な演算子やその他の関数を使用しています。具体的には、現在取り組んでいるメソッドは / 演算子です。問題は、私が望むように最後に残りを追加しないことです。

それがすべきことは、文字列の配列を取得すること{"Hello", "Test1", "Test2", "Goodbye", "More?", "Qwerty"}です。たとえば、4 で割りたいとします。返されるはずですが、返さ{ {"Hello", "Test1", "Test2", "Goodbye"}, {"More?", "Qwerty"} }れません。

クラス全体 (私が改善したいメソッドは / 演算子ですが、他に取り組むことができるものがあれば指摘してください) (コメントされているものはほとんどありません。申し訳ありませんが、他の人を期待していませんでした)私から離れてこのコードを見るために。):

public struct StringCollection
{
    private String[] value;

    public StringCollection(params String[] s)
    {
        this.value = s;
    }

    public StringCollection(StringCollection current, String ad)
    {
        if (current.value == null) {
            current.value = new String[0] { };
        }
        this.value = new String[current.value.Length+1];
            for (int i=0; i<this.value.Length; i++)
            {
                try {
                    this.value[i] = current[i];
                } catch {
                    break;
                }
            }
            this.value[this.value.Length-1] = ad;
    }
    public StringCollection(StringCollection x, params StringCollection[] y)
    {
        this.value = x.value;
        for (int j=0;j<y.Length;j++)
        {
            for (int i=0;i<y[j].value.Length;i++)
            {
                this += y[j][i];
            }
        }
    }

    public static StringCollection[] operator /(StringCollection x, int y)
    {
        StringCollection[] result = null;
        if (((int)x.value.Length/y) == ((double)x.value.Length)/y)
            result = new StringCollection[y];
        else
            result = new StringCollection[y+1];
        for (int j=0;j<y;j++)
        {
            for (int i=0;i<((int)x.value.Length/y);i++)
            {
                result[j] += x.value[i+(int)((x.value.Length/y)*j)];
            }
        }
        if (((int)x.value.Length/y) != ((double)x.value.Length)/y)
        {
                            // This is the part that isn't working.
            for (int i=0;i<(((int)x.value.Length/y)*result[0].value.Length)-x.value.Length;i++) 
            {
                result[result.Length-1] += x.value[i+((result[0].value.Length)*result.Length-2)];
            }
        }
        return result;
    }
    public String this[int index]
    {
        get {
            return this.value[index];
        }
        set {
            this.value[index] = value;
        }
    }

}

基本的には、配列(単一の配列)を取り、それを同じサイズの配列の束に分割し、最後に新しい配列の残りを追加します。

4

1 に答える 1

1

まず、あなたの質問は実際にはループとはまったく関係がないか、少なくともループはコードでのみ対処されています。あなたはこれを別のタイトルにするべきでした。

次に、アレイの追加/削除が改善される可能性があります。つまり、毎回配列サイズに 1 を追加し、1 を削除してから、毎回配列全体を再コピーすると、タイム シンクになります。

質問に移りますが、コードは基本的に次のようになります。

//Make your return array
int retLen = x.Length / y;      

//Add space for the remainder
if(x.Length % y != 0)
  retLen++;

var ret = new StringCollection[retLen];

//Reusing variables is a good way to save memory, but watch naming conventions as this can be confusing
retLen = 0;

var tempCollection = new StringCollection();

for (int i = 0; i < x.Length; i++)
{
  tempCollection = new StringCollection(tempCollection, x[i]);

  if(i % y == 0 || i == x.Length - 1)
  {
    ret[retLen++] = tempCollection;
    tempCollection = new StringCollection();
    retLen = 0;
  }    
}

return ret;

この構造体に Add 関数がないのは本当に気に入らないので、はっきりさせておきます。tempCollection = new StringCollection(tempCollection, x[i]);これらすべての新しいオブジェクトを作成するための CPU 時間に関して言えば、これは f$*kin' TERRIBLE です。

すべての項目が適切に入力されていることを確認するために微調整する必要があるのは確かですが、それは最初の試みだったので...まあ、誰も実際にあなたに答えるつもりはなかったので、私は時間をかけて考えました.

編集:バグが見つかりました。ret に追加するときに retLen を 0 に戻すのを忘れていました

于 2013-03-27T21:07:17.607 に答える