HashSet/HashMap等效的TreeSet/TreeMap(自定义哈希)

Jas*_*n S 7 java hashtable map set

TreeSet有一个带比较器的构造函数,这意味着即使您存储的Comparable对象本身不是对象,您也可以提供自定义比较器.

是否有类似的无序集实现?(例如,替代HashSet<T>它需要一个"hasher"对象来计算equals()hashCode()对象T可能与对象自己的实现不同?)

C++ std::hash_set为您提供了这个,只是想知道是否有适合Java的东西.


编辑:@Max提出了一个很好的技术观点equals()- 公平; 这是真的TreeMapHashMap钥匙通过Map.containsKey().但是否有其他众所周知的数据结构可以通过自定义哈希来组织?

Gra*_*ray 9

不,Collections规范不支持具有"hasher"对象.你当然可以实现你自己的支持这个的集合,但另一种方法是将Hasher你的存储视为一个包装对象HashSet.

Set<HasherWrapper<Foo>> set = new HashSet<HasherWrapper<Foo>>();
set.add(new HasherWrapper(foo));
...
Run Code Online (Sandbox Code Playgroud)

然后包装类看起来像:

private class HasherWrapper<T> {
    T wrappedObject;
    public HasherWrapper(T wrappedObject) {
        this.wrappedObject = wrappedObject;
    }
    @Override
    public int hashCode() {
        // special hash code calculations go here
    }
    @Override
    public boolean equals(Object obj) {
        // special equals code calculations go here
    }
}
Run Code Online (Sandbox Code Playgroud)