需求如下:
我们的系统是要与第3方交互的,现在第三方需要读取我们的某个对象(如Bean)的中的id来生成有序的文档,
所以我在该bean中加入了一个字段orderId,来排序。(第三方是不关注我们传的具体值是多少,只是要求我们
传的orderId的数字就可以了,他们会根据该值从大到小来排序)
例如:排序的顺序是bean1, bean2,bean3,bean4
那么我就会设置
bean1的orderId为1,
bean2的orderId为2,
bean3的orderId为3,
bean4的orderId为4。
这样就有一个问题,即,如果第三方要求在bean2和bean3之间加入一个bean5,那么我就需要设置bean5的orderId为3,
同时还要修改bean3的orderId为4,修改bean4的orderId为5,也就是说我在现有的顺序上加入一个新的bean时,需要
修改很多的代码,扩展性很不好。请教大家有没有好的解决方案。

解决方案 »

  1.   

    最简单办法:
    刚开始你们进行设置orderId 时设置为10 20 30 40……
    然后再bean2和bean3之间加入一个bean5,bean5设置为25就可以了
    这样做改动最小 不过不清楚你们插入的量的频率和数量
      

  2.   

    快速方法是用小数,比如double来排序。第一个的Order是0
    最后一个的Order是1每次插入一个值,则将其Order设置为前一个和后一个的中间值。能支持相当规模的要求,而且计算机处理double的效率也很高,不比long差太多。
      

  3.   

    楼主这个设置orderId的值应该不涉及效率的问题。采用小数的方式就可以,具做小数位取什么值都可以。
    但是注意保证小数点后位数一致(比如四舍五入保留一位),不然,有小数位不一致很难看。
      

  4.   

    谢谢楼上各位。
    我之前的描述有点问题,第三方要求的是传一个整数,而不可以是小数,但是具体数字还是可以不关注。我现在有一个想法:
    建一个orderUtil类,在该类中定义个list,把所有的需要排序的bean有序地放到这个list中。
    同时定义一个Map,map的key是通过一定的算法来设置的。然后通过list来初始化这个map,通过list中
    bean的顺序来设置map的value的值(第一个orderId是1,第2个orderId是第一的orderId+1,也就是说后一个orderId是前一个orderId+1生成的),然后所有需要设置的orderId的地方都调用这个util类。
    这样当需要改增加bean,或者修改顺序的时候只需要该一下list中的bean中的顺序就可以了。
      

  5.   

    这样的话,你每次获取order运算代价会比较大。也就是你每次去获取该order的时候(List.indexOf(obj)),其实都是从头至尾执行了一次计算过程。如果你的List有 10 万个,平均算一次order,就要遍历5万个节点。如果非要用整数,那么建议可以用 Long,如下:
      第一个: 0 
      最后一个:Long.MAX_VALUE
      插入时同样计算中间值
    那么需要增加的是关于冲突时(一般来说发生冲突概率很低,而且说明数据规模已经很大了):
      处理方式也很简单,就是重新按照总个数来计算平均值,然后全部重算一次。