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

是否有无序集合的类似实现? (例如,HashSet<T> 的替代方案,它采用一个“散列器”对象来计算可能与对象自己的实现不同的对象 T 的 equals()hashCode()?)

C++ std::hash_set 给了你这个,只是想知道是否有一些适用于 Java 的东西。

编辑:@Max 提出了关于 equals() 的一个很好的技术点——足够公平;对于 TreeMapHashMap 键,通过 Map.containsKey() 也是如此。但是还有其他众所周知的数据结构允许通过自定义散列器进行组织吗?

最佳答案

不,Collections规范不支持具有“哈希”对象。您当然可以实现支持此功能的自己的集合,但是另一种方法是将Hasher视为存储在HashSet中的包装对象。

Set<HasherWrapper<Foo>> set = new HashSet<HasherWrapper<Foo>>();
set.add(new HasherWrapper(foo));
...

然后,包装器类如下所示:
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
    }
}

关于java - TreeSet/TreeMap 等效于 HashSet/HashMap(自定义散列器),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8535554/

10-09 08:21