首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用字节数组作为MapDB实现BTreeMap的关键

如何使用字节数组作为MapDB实现BTreeMap的关键
EN

Stack Overflow用户
提问于 2014-07-10 07:20:04
回答 3查看 675关注 0票数 1

是否有任何方法可以在BTreeMap中使用字节数组作为键,如:

代码语言:javascript
复制
BTreeMap<byte[], Integer> myBTreeMap = db.getTreeMap("myBTreeMap");

当前,当试图将新对象放入映射时,将引发此异常:

代码语言:javascript
复制
Exception in thread "main" java.lang.ClassCastException: [B cannot be cast to java.lang.Comparable ...

怎样才能让这件事奏效呢?我想知道不使用包装类的解决方案。

任何想法都欢迎。

更新

我使用了SJuan76提出的解决方案:

代码语言:javascript
复制
    BTreeMap<byte[], Integer> myBTreeMap = db.createTreeMap("myBTreeMap")
            .comparator(SignedBytes.lexicographicalComparator())
            .makeOrGet();

如果需要,可以在番石榴图书馆找到使用过的比较器。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-10 07:28:34

看看Javadoc (我想它是该项目的Javadoc,而不是另一个项目,如果您能链接到它会很好),这里定义了一个采用构造函数Comparator<K>。使用这个构造函数,并传递给它一个Comparator<byte[]>,它给出了您想要的顺序。

票数 1
EN

Stack Overflow用户

发布于 2014-07-10 16:58:57

MapDB提供byte[]数组比较器: Fun.BYTE_ARRAY_COMPARATOR

下面是如何在代码中使用的示例:

代码语言:javascript
复制
   Map<byte[], Object> map = db.createTreeMap("map")
               .comparator(Fun.BYTE_ARRAY_COMPARATOR)
               .makeOrGet();
票数 2
EN

Stack Overflow用户

发布于 2014-07-10 07:29:13

我认为您必须将字节数组包装在实现可比较的类中:

代码语言:javascript
复制
import org.apache.commons.lang.builder.CompareToBuilder;
public class Key implements Comparable<Key> {
    private final byte[] data;

    public Key(final byte[] data) {
        this.data = data;
    }

    public int compareTo(final Key k) {
        return new CompareToBuilder().append(data, k.data).toComparison();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + getOuterType().hashCode();
        result = prime * result + Arrays.hashCode(data);
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Key other = (Key) obj;
        if (!getOuterType().equals(other.getOuterType())) {
            return false;
        }
        if (!Arrays.equals(data, other.data)) {
            return false;
        }
        return true;
    }

    private Test getOuterType() {
        return Test.this;
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24670628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档