需求如下:
我们的系统是要与第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时,需要
修改很多的代码,扩展性很不好。请教大家有没有好的解决方案。
我们的系统是要与第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时,需要
修改很多的代码,扩展性很不好。请教大家有没有好的解决方案。
刚开始你们进行设置orderId 时设置为10 20 30 40……
然后再bean2和bean3之间加入一个bean5,bean5设置为25就可以了
这样做改动最小 不过不清楚你们插入的量的频率和数量
最后一个的Order是1每次插入一个值,则将其Order设置为前一个和后一个的中间值。能支持相当规模的要求,而且计算机处理double的效率也很高,不比long差太多。
但是注意保证小数点后位数一致(比如四舍五入保留一位),不然,有小数位不一致很难看。
我之前的描述有点问题,第三方要求的是传一个整数,而不可以是小数,但是具体数字还是可以不关注。我现在有一个想法:
建一个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中的顺序就可以了。
第一个: 0
最后一个:Long.MAX_VALUE
插入时同样计算中间值
那么需要增加的是关于冲突时(一般来说发生冲突概率很低,而且说明数据规模已经很大了):
处理方式也很简单,就是重新按照总个数来计算平均值,然后全部重算一次。