【发布时间】:2015-02-14 23:31:33
【问题描述】:
我正在尝试创建一个使用相对距离比较的有序地图。但是,ConcurrentSkipListMap(这是我目前正在使用的)解释来自 Comparator 的比较的方式使得比较相对距离变得不可能。是否有任何数据结构允许像键值操作和相对排序这样的映射?
当我说相对比较时,我的意思是两个值不能直接比较,而必须用一个参考点来看待。像欧几里得距离一样思考。
编辑:
例如:当比较二进制数 0011 和 1100 时,我想说一个大于另一个基于汉明距离(两个数字的异或中的 1 位的数量,相当于超立方体中两个节点之间的距离图),显然我需要一个参考点来比较距离,所以我选择0000作为参考。从0011到0000的距离是2,从1100到0000的距离是2,但是1100不等于0011。我想说它们的相对距离相同,但不相等。最终将生成这些数字的排序列表。对于参考 0000,按升序排列,我们可能有 1000、0100、1100、1001、0011、1110、1101、1111。
EDIT2,为什么我不能使用比较器:
这个总订单的商是: {(x, y) 使得 c.compare(x, y) == 0}。
从 compare 的契约中可以直接得出,商是 S 上的等价关系,并且强加的排序是 S 上的全排序。当我们说 c 强加在 S 上的排序与 equals 一致时,我们表示排序的商是由对象的 equals(Object) 方法定义的等价关系: {(x, y) 使得 x.equals(y)}。
http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
【问题讨论】:
-
示例输入和输出会有所帮助。
-
您能否发布一些代码来显示您正在尝试做的事情,即使它不起作用?或者 khelwood 所说的示例输入和输出。
-
为什么需要建立这样的排序?不同的数据结构,例如4-d tree,是否更适合您的目的?如果您正在使用可能比排序列表更有意义的 4 维几何图形。
-
我不是数学群论方面的专家。但是我对您的引用的理解是,比较器的等价组是由在进行比较时都导致 0 的项目定义的。我看不出这是如何排除使用这种类型的比较器的——只要比较器的行为是固定的。事实上,它经常用于编码,所以我怀疑你误解了文档。
-
“我想说它们的相对距离相同,但不相等。” 然后你需要决定一些其他指标来比较它们时距离相等。
标签: java dictionary data-structures distance comparator