2011-03-24 48 views
1

顺序我已经得到了我们从第三方提供商获取整数数组。这些都意味着是连续的,但由于某种原因,他们错过了一些(东西抛出一个异常,它的食用和循环继续缺少指数)。这导致我们的系统有些悲伤,我试图确保我们得到的数组确实是顺序的。确保阵列在C#

的数字从不同的偏移量(有时是1000,有时候5820,其他0),但无论开始启动,它意味着从那里走。

什么是验证阵列是连续的最快方法是什么?尽管现在看来它是必需的一步,但我也必须确保它不会花太长时间来验证。我现在开始第一指数,拿起数并加1,并确保下一个索引包含等

编辑: 为什么系统失败的原因是,因为人们使用此系统,方式并不总是以最初被选中的方式返回令牌 - 长话短说。数据不能被纠正,直到它不幸地到达我们的层。

+2

如果你总是得到一个顺序数组 - 为什么他们只是传递一个数字给你来生成数组在你身边? – zerkms 2011-03-24 00:24:26

+0

你需要它是连续的还是连续的? – eulerfx 2011-03-24 00:25:35

+0

是否有可能只获取起始值和最终值(或元素数量)并自己创建数组? 'Enumerable.Range(开始,计数)' – 2011-03-24 00:36:57

回答

7

如果你确认数组进行排序,并没有重复,你可以检查:

array[array.Length - 1] == array[0] + array.Length - 1 
+0

+1这很聪明。只需检查最后一个数字是否等于开始数字加上数组长度。无需任何循环及其O(1)复杂性。 – 2011-03-24 00:29:58

+0

@JK:但它很大程度上取决于生成侧的错误种类。如果发生了一些事情,中间有一个数字发生了两次,该怎么办?我们仍然会通过此检查,但顺序是错误的。 – zerkms 2011-03-24 00:34:11

+0

@zerkms:你完全正确。这就是为什么我确定要保证这只有在数组保证被排序并且没有任何困难的情况下才有效。 – Gabe 2011-03-24 00:39:27

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 
+0

是不是这样的: for(int i = 1; i 2011-03-24 03:17:28

+1

我向后迭代,以便a.Length只被计算一次! – 2011-03-24 03:25:59

+1

哦,我明白了! if语句应该是:if(a [i]!= a [i + 1] +1)返回false; – 2011-03-24 03:28:06

0

Gabe的方式肯定是最快的是如果数组进行排序。如果数组是没有排序,那么它很可能是最好的数组进行排序(与合并/壳排序(或类似速度的东西)),然后使用Gabe的方式。

1

我认为这是值得解决更大的问题在这里:如果数据不符合您的要求(顺序,没有差距),你会怎么做?

如果你还是会来处理数据,那么你或许应该投资自己的时间使你的系统更有弹性的间隙或丢失的数据条目。

* *如果你需要处理的数据,并一定要干净,你应该与供应商合作,以确保他们给你形成良好的数据。

如果您要跳过处理并报告错误,那么声明无间隙的先决条件可能是一条可行的路。在C#中有许多不同的事情可以做:

  1. 如果数据进行排序,并没有DUP的,只是检查是否LastValue == FirstValue + ArraySize - 1
  2. 如果数据没有排序,但DUP免费,只是排序它,做以上。
  3. 如果数据没有排序,有dups和你真的想检测差距,我会使用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}呢?