Java 树映射的通用比较器<;对象,T>;?

Java 树映射的通用比较器<;对象,T>;?,java,object,tree,comparator,Java,Object,Tree,Comparator,我需要TreeMap,但我的对象既不可比较,也没有通用的比较器 树中的顺序只与树本身相关,是否有任何通用的比较器可以用于树 信息: 我想为一些数据库(如库)添加一个简单的缓存机制,专门用于批量导入。由于这是一项非常消耗内存的任务,我更喜欢使用基于树的映射而不是HashMap,因此BulkImportCache的空间效率更高,并且可以根据需要进行扩展和收缩 编辑:代码已更新 这可能有效,但使用校验和算法要求对象不发生变异。试图找到一个合适的测试方法 import org.apache.commo

我需要
TreeMap
,但我的对象既不可比较,也没有通用的
比较器

树中的顺序只与树本身相关,是否有任何通用的比较器可以用于树

信息: 我想为一些数据库(如库)添加一个简单的缓存机制,专门用于批量导入。由于这是一项非常消耗内存的任务,我更喜欢使用基于树的映射而不是HashMap,因此BulkImportCache的空间效率更高,并且可以根据需要进行扩展和收缩

编辑:代码已更新

这可能有效,但使用校验和算法要求对象不发生变异。试图找到一个合适的测试方法

import  org.apache.commons.lang3.builder.HashCodeBuilder;

class HashCodeComparator implements Comparator<Object>{
    @Override
    public int compare(Object o1, Object o2) {
        final int dif = o1.hashCode() - o2.hashCode();
        if (dif == 0)
                if(o1.equals(o2))
                    return 0;
                else
                    return HashCodeBuilder.reflectionHashCode(o1) - HashCodeBuilder.reflectionHashCode(o2);
        else
            return dif;
    }
import org.apache.commons.lang3.builder.HashCodeBuilder;
类HashCodeComparator实现Comparator{
@凌驾
公共整数比较(对象o1、对象o2){
final int dif=o1.hashCode()-o2.hashCode();
如果(dif==0)
如果(o1.等于(o2))
返回0;
其他的
返回HashCodeBuilder.reflectionHashCode(o1)-HashCodeBuilder.reflectionHashCode(o2);
其他的
返回dif;
}

为了能够使用
树映射
,您必须能够比较要存储在
映射
中的实例。您可能有一个比较器,该比较器知道可以存储在映射中的不同类型的对象,并根据类型委托给特定类型的比较器。但是,您必须提供对其进行切片的任何方法取消比较机制,不可比较的
对象不存在比较机制。

这将不起作用。不相等的对象可以(并且将)具有相同的哈希代码。您将得到一个缓存(看起来)随机返回错误的值。这将不起作用,因为两个不相等的对象可以具有相等的哈希代码。否,因为如果
compare(a,b)
返回
-1
,然后
compare(b,a)
必须返回
1
。在您的实现中,两个return
-1
@JohnB都会再次更新。当在嵌套的else分支中使用其他哈希算法的校验和之差时,它能工作吗?请参阅代码。我正在考虑如何以一般方式对此进行测试…不,因为您的两个元素可能不相等,并且
HashCodeBuilder
可以为它们返回相同的值。与您刚刚使用
hashCode
比较它们的哈希代码没有什么不同,因此您更喜欢
O(nlgn)
放置时间,而不是
O(1)
put time?这似乎是批量导入的一个糟糕选择…@Boris the Spider:我还在调查。这不仅仅是速度问题,也是内存问题。而且我相信是O(lgn)而不是O(n ln)。另外,请记住,哈希映射没有O(1)当它必须一直增长时。你可能会说,好吧,只需要设置一个足够大的开始大小。但是如果它增长超过这个值,底层哈希表会立即占用更多的空间。