我从第三方提供商那里获得了一系列整数。这些都是顺序的,但由于某种原因,它们会错过一个数字(抛出异常,它被吃掉,循环继续丢失该索引)。这导致我们的系统有些悲伤,我正在努力确保我们得到的阵列确实是连续的。
数字从不同的偏移量开始(有时为1000,有时为5820,其他为0),但无论什么开始,它都意味着从那里开始。
验证阵列顺序的最快方法是什么?即使它现在看来是必需的步骤,我也必须确保它不需要太长时间来验证。我目前从第一个索引开始,拿起数字并添加一个并确保下一个索引包含该数据等。
编辑: 系统失败的原因是人们使用系统的方式可能并不总是像最初选择的那样返回令牌 - 长篇大论。不幸的是,在数据到达我们的图层之前无法更正数据。
答案 0 :(得分:7)
如果您确定数组已排序且没有重复项,则可以检查:
array[array.Length - 1] == array[0] + array.Length - 1
答案 1 :(得分:1)
我认为值得解决这个更大的问题: 如果数据不符合您的要求(顺序,无间隙),您打算做什么? < / p>
如果你仍然要处理数据,那么你应该花时间让你的系统更容易适应数据中的空白或缺少条目。
* *如果您需要处理数据且必须干净,您应该与供应商合作,确保他们向您发送格式正确的数据。
如果您要跳过处理并报告错误,那么断言无间隙的前提条件可能就好了。在C#中,你可以做很多不同的事情:
LastValue == FirstValue + ArraySize - 1
。 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}呢?
答案 2 :(得分: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
答案 3 :(得分:0)