1

整数配列のリストがあり、配列が時系列であるかどうか、そうでない場合はリストから削除するかどうかを各配列で確認したい。

現時点では、次のようにしています。

for (int i = 0; i < allXcombis.Count(); i++)
{
    bool remove = false;
    for (int j = 0; j < allXcombis[i].Length; j++)
    {
        if (allXcombis[i].Count() - 1 > j)
            if (allXcombis[i][j] != allXcombis[i][j + 1] - 1)
                remove = true;
    }
    if (remove)
        allXcombis.Remove(allXcombis[i]);
}

しかし、私はこのコードにあまり満足していません。もっと簡単にできると思います。

4

4 に答える 4

2

まず、配列が「時系列」であるというチェックを独自のメソッドに抽出しreturn、ループから早期に実行することで、より効率的にします。

bool IsChronological(int[] array)
{
    for (int i = 0; i < array.Length - 1; i++)
    {
        if (array[i] != array[i + 1] - 1)
            return false;
    }

    return true;
}

そして、私は単に使用しますRemoveAll()

allXcombis.RemoveAll(a => !IsChronological(a));

このようにして、簡潔で読みやすいコードが得られ、リスト内のインデックスについて心配する必要はありません(他の人が述べたように、インデックスに注意していないため、コードにバグがあります)。

于 2012-07-15T09:50:32.573 に答える
0

ループ内のリストから削除する場合は、ループ変数を修正するか、逆方向にループする必要があります。では、Count の後の () は必要ありません。また、remove = true を割り当てた後にループから抜けることができます。これにより、パフォーマンスが向上します。

for (int i = allXcombis.Count - 1; i >= 0; i--)
{
    bool remove = false;
    for (int j = 0; j < allXcombis[i].Length; j++)
    {
        if (allXcombis[i].Length - 1 > j)
        {
            if (allXcombis[i][j] != allXcombis[i][j + 1] - 1)
            {
                remove = true;
                break;
            }
        }
    }
    if (remove)
        allXcombis.Remove(allXcombis[i]);
}
于 2012-07-15T09:37:20.520 に答える
0

時系列で並べ替えを意味する場合は、< ではなく != をチェックする必要があります。また、いくつかのことを単純化することもできます。最も重要なのは、反復を続けないように、内部ループから抜け出すためにソートされていないことがわかった場合です。また、削除するときに i を減らす必要があります。そうしないと、いくつかの配列をスキップするためです (たとえば、i = 2 で 2 番目の配列を削除すると、3 番目の配列が 2 番目になりますが、次の反復では i が 3 になるため、スキップします)

for (int i = 0; i < allXcombis.Count; i++)
{
    for (int j = 0; j < allXcombis[i].Length-1; j++)
    {
        if (allXcombis[i][j] > allXcombis[i][j + 1] - 1)
        {
            allXcombis.Remove(allXcombis[i]);
            i--;
            break;
        }
    }
}
于 2012-07-15T09:40:00.033 に答える
0

彼が提案した「IsChronological」のような専用メソッドの使用についてはsvickに同意しますが、このメソッドにセキュリティとパフォーマンスを少し追加したいと思います。

bool IsChronological(int[] array)
{
    bool result = ((array == null) || (array.Length == 0)) ? false : true; //Null or empty arrays are not chronological by definition (also avoid exceptions)
    if (result)
    {
        result = (array.Length == 1) ? true : false; //Arrays with only one element are chronological by definition
        if (!result)
        {
            int length = array.Length - 1;
            int index = 0;
            while ((index < length) && (array[index] == array[index] + 1))
                index++;
            result = (index == array.length);
        }
    }
    return result;
}
于 2012-07-15T12:38:52.187 に答える