我有一个排序的(Mongodb)对象集合:
{"_id": ObjectId(...), "person": "Homer", "order": 1},
{"_id": ObjectId(...), "person": "Marge", "order": 2}
我想在两个对象之间添加,追加或插入另一个对象。我试过这个使用这样的浮点数:
{"_id": ObjectId(...), "person": "Homer", "order": 1},
{"_id": ObjectId(...), "person": "Bart", "order": 1.5},
{"_id": ObjectId(...), "person": "Marge", "order": 2}
订单值是前一个和下一个对象中字段order
的算术平均值。只要数字看起来不像1.9999999
,它就能正常工作。然后将其四舍五入为2,并且不对该集合进行排序。
我可以用这种方式使用整数:
{"_id": ObjectId(...), "person": "Homer", "order": 1},
{"_id": ObjectId(...), "person": "Bart", "order": 2},
{"_id": ObjectId(...), "person": "Marge", "order": 3}
但这意味着需要修改其他对象,我宁愿避免这种情况。
我考虑过使用字符串和词法排序来阻止命令:
{"_id": ObjectId(...), "person": "Homer", "order": aa},
{"_id": ObjectId(...), "person": "Bart", "order": ab},
{"_id": ObjectId(...), "person": "Marge", "order": bb}
但似乎很难实施。有没有更简单的方法呢?
答案 0 :(得分:2)
我认为浮动方法最有意义。 假设你从所有位置开始作为整数,那么在你遇到精度问题之前需要一个很多的掉期。
我建议每当你改变一个项目的“顺序”时,看看它是否太靠近它的一个邻居。如果是,则重新分配对象的所有的值(因此它们都是全部整数)。
如果设置| x-y |的限制> = 2 **( - 50),这很好,因为python为浮点数保留了53个精度位,在你需要重新分配订单之前需要至少50个不幸的交换。
编辑:我刚看到您没有具体询问Python。将精度替换为适合您系统的精度。