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

时间:2014-07-10 07:20:05

标签: java mapdb

有没有办法在BTreeMap中使用字节数组作为键:

BTreeMap<byte[], Integer> myBTreeMap = db.getTreeMap("myBTreeMap");

当尝试将新对象放入地图时,会抛出此异常:

Exception in thread "main" java.lang.ClassCastException: [B cannot be cast to java.lang.Comparable ...

使这个工作的正确方法是什么?我想在不使用包装类的情况下知道解决方案。

欢迎任何想法。

[UPDATE]

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

    BTreeMap<byte[], Integer> myBTreeMap = db.createTreeMap("myBTreeMap")
            .comparator(SignedBytes.lexicographicalComparator())
            .makeOrGet();

如果需要,可以在Guava库中找到使用过的比较器。

3 个答案:

答案 0 :(得分:2)

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

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

   Map<byte[], Object> map = db.createTreeMap("map")
               .comparator(Fun.BYTE_ARRAY_COMPARATOR)
               .makeOrGet();

答案 1 :(得分:1)

查看Javadoc(我想这是该项目的Javadoc,而不是另一个项目,你可以很好地链接到它)。定义了constructor,需要{{1} }。使用该构造函数并将其传递给Comparator<K>,以提供您想要的顺序。

答案 2 :(得分:1)

我认为你必须将字节数组包装在一个实现Comparable的类中:

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;
    }

}