2011-02-23 55 views
1

我有具有OrderNum字段的对象的列表。如何最佳地更改item.OrderNum字段以匹配列表顺序

OrderNum字段必须与列表顺序相匹配(但不必连续)。

简单的解决方案。重置每ORDERNUM当列表顺序变化:

for (int i = 0; i < list.length; i++) { 
    list[i].OrderNum = i; 
} 

但随着ORDERNUM都存储在SQL,ORDERNUM的少量复位,更好。当OrderNum必须重置时,更改可能很大。有32位可用。有序列表检索者:

SELECT * FROM orderable_items ORDER BY order_num; 

实际的编程语言是C#。

+0

我正在考虑最初有均匀分布的线条,以便插入其他项目时总会有足够的数字空间。我从来没有真正拥有**最初的**名单。只是一些版本,几乎可以在OrderNum中有任何东西。尽管大多数列表已排序。也许找到最长的子序列会有所帮助? – jkj 2011-02-23 18:36:33

+0

你知道你可以期待什么样的改变,或者你想要一个通用的重新排序功能,尽可能少的数字改变? – Beta 2011-02-23 19:40:54

+0

大多数是一个新项目出现/更改列表中的地方。尽管有时并没有一个理智的OrderNums开始。我正在寻找一个通用的解决方案,但它也有可能例如成功移动一个项目或退回重新编号。 – jkj 2011-02-24 09:41:27

回答

0

假设数字稀疏间隔,你可以做到以下几点:

  • 计算目标指数中的每个元素在指数原始列表
  • 计算longest increasing subsequence(O(nlogn))
    • 保留ORDERNUM不变,在计算子
    • 变化的元素的其余部分OrderNums的元素,使他们落入合适的差距

这里假设原始OrderNums之间有足够的空间。经过几次这样的重新排序后,您可能需要重新调整数字,以便确实如此。