1

サードパーティのプロバイダーから取得した整数の配列があります。これらはシーケンシャルであることを意図していますが、何らかの理由で数値が欠落しています (何かが例外をスローし、それが食べられ、ループがそのインデックスを欠落し続けます)。これは私たちのシステムにいくらかの悲しみを引き起こし、私たちが取得している配列が実際にシーケンシャルであることを確認しようとしています.

数値はさまざまなオフセット (1000 の場合もあれば、5820 の場合もあれば、0 の場合もあります) から始まりますが、開始点が何であれ、そこから移動することを意味します。

配列がシーケンシャルであることを確認する最速の方法は何ですか? 今では必須の手順のようですが、検証に時間がかかりすぎないようにする必要もあります。私は現在、最初のインデックスから始めて、番号を取得して追加し、次のインデックスにそれが含まれていることを確認しています。

編集:システムが失敗する理由は、人々がシステムを使用する方法が原因で、トークンが最初に選択された方法で常に返されるとは限らないためです-長い話。残念ながら、レイヤーに到達するまでデータを修正することはできません。

4

4 に答える 4

7

配列がソートされていて重複がないことが確実な場合は、次のことを確認してください。

array[array.Length - 1] == array[0] + array.Length - 1
于 2011-03-24T00:22:34.993 に答える
1

ここで、より大きな問題に取り組む価値があると思います。 データが要件を満たしていない場合 (シーケンシャル、ギャップなし)、どうしますか?

それでもデータを処理する場合は、データのギャップやエントリの欠落に対するシステムの回復力を高めることに時間を費やす必要があります。

* *データを処理する必要があり、クリーンである必要がある場合は、ベンダーと協力して、整形式のデータが送信されるようにする必要があります。

処理をスキップしてエラーを報告する場合は、ギャップがないという前提条件を主張するのがよいでしょう。C# では、さまざまなことができます。

  1. データがソートされていて重複がない場合は、チェックしてくださいLastValue == FirstValue + ArraySize - 1
  2. データがソートされていないが複製されていない場合は、ソートして上記を実行してください。
  3. データがソートされておらず、重複があり、実際にギャップを検出したい場合は、LINQ を使用します。

List<int> gaps = Enumerable.Range(array.Min(), array.Length).Except(array).ToList();

またはさらに良い(上限値が範囲外である可能性があるため):

int minVal = array.Min();
int maxVal = array.Max();
List<int> gaps = Enumerable.Range(minVal, maxVal-minVal+1).Except(array).ToList();

ところで、高密度でギャップのない整数の配列が渡されるという全体的な概念は、2 つのパーティ間のインターフェイスとしては少し奇妙です。ただし、それらに関連する追加データがない限りは。他にデータがない場合は、代わりに {min,max} の範囲を送信してみませんか?

于 2011-03-24T00:35:47.840 に答える
0
for (int i = a.Length - 2; 0 <= i; --i)
{
    if (a[i] >= a[i+1]) return false; // not in sequence
}
return true; // in sequence
于 2011-03-24T00:23:13.777 に答える
0

配列がソートされている場合、ゲイブの方法は間違いなく最速です。配列がソートされていない場合は、(マージ/シェルソート (または同様の速度のもの) を使用して) 配列をソートしてから、Gabe の方法を使用するのがおそらく最善です。

于 2011-03-24T00:28:06.520 に答える