1

有没有办法像这样使用字节数组作为键BTreeMap

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

当前尝试将新对象放入地图时会引发此异常:

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

什么是使它工作的正确方法?我想知道不使用包装类的解决方案。

欢迎任何想法。

[更新]

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

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

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

4

3 回答 3

2

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

这是一个如何在代码中使用的示例:

   Map<byte[], Object> map = db.createTreeMap("map")
               .comparator(Fun.BYTE_ARRAY_COMPARATOR)
               .makeOrGet();
于 2014-07-10T16:58:57.093 回答
1

查看 Javadoc(我猜它是那个项目的 Javadoc,而不是另一个,如果你能链接到它会很高兴)定义了一个构造函数,它需要一个Comparator<K>. 使用该构造函数并传递给它一个Comparator<byte[]>你想要的顺序。

于 2014-07-10T07:28:34.090 回答
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;
    }

}
于 2014-07-10T07:29:13.647 回答