现在的位置: 首页 > 综合 > 正文

记录一列数据的顺序的思路

2017年11月20日 ⁄ 综合 ⁄ 共 1218字 ⁄ 字号 评论关闭

       有时候会遇到这样的问题,要给一列数据进行排序,但是顺序是由用户任意指定的。我想出来如下2个解决方案。

方案A:这一列数据如果每个单元都拥有id,那么可以将id按照顺序进行拼接,某种字符隔开每一个id。这样依靠这个字符串,就可以记录这一列的顺序。当修改了其中某个单元的顺序时,只需要重新生成一下这个字符串即可。通过这个字符串还原成原来的顺序,也还算方便。唯一有点不爽的是,每次对这一列数据进行顺序改动或者数据插入删除时,都要改一下那个顺序字符串。

方案B:如果每次对这列数据进行改动时,并不想修改那个顺序字符串,那么就不用字符串拼接来记录顺序。可以给单元数据增加一个正整数类型的排序字段。这样当这一列数据自数据库中查询出来的时候,我们可以直接使用sql语句进行排序。但是,如果仅仅是以1、2、3、4、5、6这样的数字来记录顺序,问题显而易见,当用户调整了某一个单元的数据顺序时(如将6插入1-2之间,如果在用户界面上进行限制顺序调整操作,比如只能进行位置对换,如6跟2交换位置,那么就不需要调整全部排序字段的内容,不过这样体验明显不佳),就必须将这一整列里所有的单元的排序字段重新修改一遍。因此这个数字得改一改,怎么改?很简单。

现在我以2的3次方为递增值来设定排序字段内容。8,16,24,32。看到这里是不是心里突然有一丝灵感闪现?别急。现在我把32插入到8-16之间,那么我只需要让32这个值改成(8,16)这个区间中的任意一个整数,这一列的新顺序就自然生成了,而且只需要修改被调整顺序的那个单元的排序字段就ok。不过这还是会有问题。假设我让32变成9,那么新的排序会变成 8,9,16,24,32 ,于是8-9之间就无法再插入了,这可不行,看来这个值并不是仅仅满足于(8,16)就行。事实上,这个值应该取为12。12的好处是,可以让8-12之间还有空隙插入。当然这其中还是有一个问题,不能无限插入,能插几次,就得看这个递增值是2的几次方。

所以可以根据业务的特点,设定合理的递增值。比如以2的20次方来递增,则可以在本来相邻的两个单元之间插入20次。不要觉得20次太少,当用户在排序的时候,如果需要在相邻两个单元之间插入20个单元,这种排序方式很蠢很累,因为实现这种排序无需20次插入调整。举个例子,8,16,24,32,40,要让顺序变成8,24,32,40,16(这样新的排序字段内容变成8,9,10,12,16),何须3次插入?一次足矣。

最后一个不可回避的问题是,当达到插入上限时,怎么办?凉拌,自然是重新生成一遍所有单元的排序字段内容了。如当我在检测到8,9,10,12,16,其中生成9这个值的时候,我就要重新初始化一下这个排序字段了。9是怎么生成的?(10-8)再右移一位得到1,10-1得到9。那么在此之后,需要启动排序字段内容重置操作,将之按照当前的顺序,重新改成8,16,24,32,40。则上限重置,实现无限插入。

抱歉!评论已关闭.