убедитесь, что массив является последовательным в C # - PullRequest
1 голос
/ 24 марта 2011

У меня есть массив целых чисел, которые мы получаем от стороннего поставщика. Они должны быть последовательными, но по какой-то причине они пропускают число (что-то выдает исключение, оно съедается, и цикл продолжает пропускать этот индекс). Это вызывает у нашей системы некоторое горе, и я пытаюсь убедиться, что массив, который мы получаем, действительно последовательный.

Числа начинаются с разных смещений (иногда 1000, иногда 5820, другие 0), но независимо от начала, оно должно идти оттуда.

Какой самый быстрый способ проверки последовательности массива? Несмотря на то, что это необходимый шаг, как кажется сейчас, я также должен убедиться, что проверка не займет слишком много времени. В настоящее время я начинаю с первого индекса, собираю число и добавляю один, и проверяю, что следующий индекс содержит это и т. Д.

EDIT: Причина, по которой система дает сбой, заключается в том, как люди используют систему, и она не всегда возвращает токены так, как это было изначально выбрано - длинная история. Данные не могут быть исправлены, пока, к сожалению, они не попадут на наш слой.

Ответы [ 4 ]

7 голосов
/ 24 марта 2011

Если вы уверены, что массив отсортирован и не имеет дубликатов, вы можете просто проверить:

array[array.Length - 1] == array[0] + array.Length - 1
1 голос
/ 24 марта 2011

Я думаю, что здесь стоит рассмотреть более крупную проблему: что вы будете делать, если данные не соответствуют вашим требованиям (последовательные, без пробелов)?

Если вы все еще собираетесь обрабатывать данные , то вам, вероятно, стоит потратить время на то, чтобы сделать вашу систему более устойчивой к пробелам или пропущенным записям в данных.

** Если вам нужно обработать данные и они должны быть чистыми , вам следует поработать с поставщиком, чтобы убедиться, что он отправляет вам корректные данные.

Если вы собираетесь пропустить обработку и сообщить об ошибке , тогда утверждение предусловия отсутствия пропусков может быть подходящим способом. В 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();

Кстати, сама концепция прохождения плотного, незаполненного массива целых чисел немного странна для интерфейса между двумя сторонами, если только с ними не связаны какие-либо дополнительные данные. Если других данных нет, почему бы просто не отправить диапазон {min, max} вместо этого?

0 голосов
/ 24 марта 2011

У Гейба определенно самый быстрый способ сортировки массива. Если массив не отсортирован, то, вероятно, было бы лучше отсортировать массив (с сортировкой слиянием / оболочкой (или с аналогичной скоростью)), а затем использовать способ Гейба.

0 голосов
/ 24 марта 2011
for (int i = a.Length - 2; 0 <= i; --i)
{
    if (a[i] >= a[i+1]) return false; // not in sequence
}
return true; // in sequence
...