2011-02-08 73 views
0

我有一个巨大的名单。我可以添加/重新排列/从这个列表中删除项目。 由于列表真的是bug,我不想将整个列表的快照存储在系统中的任何位置。 而是我维护一个xml文件以跟踪添加/移动的项目。有效维护名单

每个条目都与index and change order关联。
Def- Change order:项目添加/移动的顺序。
Def- Index:添加/移动项目的索引。

所以现在无论何时我需要显示列表,我都会有我的原始列表和xml文件。我将使用xml文件,我将根据更改顺序添加/移动项目。

无论何时我想从列表中移动/删除任何项目,我都必须更改其他项目的索引。

为了这个,我用简单的代码:

for each item in list: 
    If item's change order > removed/moved item's change order: 
     Do Item's CO = item's CO - 1 
     If item's index > removed item's index (This index is not actual index, 
               is the index where we inserted 
               /moved the item. Item's actual 
               index can be different, because 
               of the movements of other items 
               in the list) 
      Do Item's index = item's index - 1 

这个代码在很多情况下失败。例如。

原版(S,d,G,Y,U,I)

在我的XML

我有

X: (newly added) CO 1, index 5 
Giving me: (S, D, G, Y, X, U, I) 
Y: (already in list at position 4) CO 2 index 6 
Giving me: (S, D, G, X, Y, U, I) 
在此之后

在我的实际列表:

X: pos: 4 
Y: pos: 5 

现在我想删除X.根据代码
Y:CO 1 index 5

应用到原始列表中:(S,D,G,U,Y,I)

这是错误的!

这种类型的需求是否有任何正确的现有算法?

感谢....


我不能存储在数据库中的文件。原始列表可能会改变。例如。基表是(p,q,r)。 xml是:(将x添加到第2个pos,将y添加到第4个pos,将Q移动到第4个pos)。但是,我的基础列表可能会变成(w,p,r,g,h),我必须使用相同的xml文件(将x添加到第2个pos,将y添加到第4个pos,将Q移动到第4个pos ),以便在预期位置添加新元素。如果某些项(如Q)不在基本列表中,但是在xml中,则必须忽略该xml节点。

+0

所以,名单是巨大的,你不想存储它,因为它真的很大。但是你想存储你所做的所有更改。用* XML *。我认为这不会让它变小。 – 2011-02-08 17:46:21

+0

它有多大? – 2011-02-08 17:52:34

回答

1

它没有解决你的算法的问题,但你可以将你的列表存储在数据库中吗?你可以使用基于文件的DBMS,比如SQLite,使用起来非常简单。

在我看来,你正在描述的操作可以很容易地用一些简单的SQL语句完成。

编辑:MySQL更改为SQLite