如何在数组中移动项目?

时间:2008-09-29 14:05:33

标签: c# data-structures

我有一组时间敏感的项目。经过一段时间后,最后一项需要脱落,并在开头放置一个新项目。

这样做的最佳方式是什么?

11 个答案:

答案 0 :(得分:10)

我建议使用队列,只是数组或列表的特殊实例。当您的定时事件发生时,弹出队列中的最后一项,然后按下您的新项目。

答案 1 :(得分:7)

使用数组执行此操作的最简单方法可能是使用循环索引。而不是总是查看array [n],你将引用数组[cIndex](其中cIndex引用被索引的数组中的项目(cIndex基于arraySize(cIndex%arraySize)递增)。

当您选择删除数组中最旧的项时,您只需引用位于((cIndex +(arraySize - 1))%arraySize)的元素。

或者,您可以使用linkedList方法。

答案 2 :(得分:6)

改为使用Queue

答案 3 :(得分:1)

使用队列,最好是使用链表实现的队列。

答案 4 :(得分:1)

查看using a Queue而不是简单的数组。

答案 5 :(得分:1)

如果有固定数量的项目,队列将起作用。

鉴于'time of time'已知,具有DateTime键的SortedDictionary如何,并覆盖Add方法以删除具有太旧键的所有项目。

答案 6 :(得分:1)

LinkedList<T>具有应该完美运行的AddFirst和RemoveLast成员。

编辑:看看队列文档,似乎他们使用内部数组。只要实现使用循环数组类型算法,性能应该没问题。

答案 7 :(得分:0)

在csharp 3中你可以这样做:

original = new[] { newItem }.Concat(
    original.Take(original.Count() - 1)).ToArray()

但是你可能最好使用专门的数据结构

答案 8 :(得分:0)

Queue非常适合FIFO数组。对于通用数组处理,请使用List(T) 例如,Insert(0, x)RemoveAt(0)方法可以放置或删除列表前面的项目。

答案 9 :(得分:0)

从技术上讲,你需要一个双端队列。队列只有一个项目被推送和弹出。双端开放的双性人。

大多数语言都允许数组操作,只需删除第一个元素并将另一个元素放在最后。

或者,您可以通过循环移动每个元素。只需用邻居替换每个元素(从最旧的元素开始)。然后将新项目放在最后一个元素中。

如果你知道你的双端队列不会超过一定的大小,那么你可以把它变成圆形。你需要两个指针来告诉你两端的位置。添加和删​​除项目会相应地增加/减少指针。你必须检测缓冲区溢出情况(即你的指针'交叉')。而且你将不得不使用模数运算,所以你的指针绕数组循环。

或者您可以为数组中的每个元素添加时间戳,并在它们变得太旧时删除它们。您可以通过以相同的方式保持单独的数组索引,或者通过具有两个元素数组的数组,并将时间戳存储在其中一个子元素中来实现。

答案 10 :(得分:0)

如果你正在寻找最快的方法,那么它将是一个圆形数组:你跟踪你在数组中的当前位置(ndx),以及结束数组(结束),所以当你插入一个项目时,你隐含地删除了最旧的项目。

循环数组是我所知道的固定大小队列的最快实现。

例如,在C / C ++中,它对于整数看起来像这样(当你得到0时退出):

int queue[SIZE];
int ndx=0;      // start at the beginning of the array
int end=SIZE-1;
int newitem;
while(1){
  cin >> newitem;
  if(!newitem)  // quit if it's a 0
    break;
  if(ndx>end)   // need to loop around the end of the array
    ndx=0;
  queue[ndx] = newitem;
  ndx++
}

可以进行大量优化,但如果您想自己构建,这是最快的路线。

如果您不关心性能,请使用随附的Queue对象,因为它应该是通用的。

它可能会也可能不会被优化,并且它可能不支持固定大小的列表,因此请务必在使用前查看相关文档。