2012-07-15 71 views
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

什么是“时间” – 2012-07-15 09:37:12

+0

@petar:http://en.wikipedia.org/wiki/Chronological – 2012-07-15 13:07:03

回答

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]); 
} 
0

如果按照时间顺序排序,那么您需要检查<而不是!=。 你也可以简化一些事情。最重要的是,当你发现它没有被排序以脱离内部循环,所以你不会继续迭代。 你也需要减少我当你删除,因为你会跳过一些数组,否则(如果我= 2,你删除第二个数组,然后第三个数组成为第二,但我会在下一个迭代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; 
     } 
    } 
} 
+0

如果它是List,则不需要()Count – 2012-07-15 09:57:05

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)); 

通过这种方式,您可以获得简洁易读的代码,而且不必担心列表中的索引(如其他人提到的,您的代码中存在一个错误,因为您不小心索引)。

0

svick在使用专用方法的认同一样,他提出了“IsChronological”,但我想安全性和性能的一点点添加到此方法:

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; 
}