有没有办法在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库中找到使用过的比较器。
答案 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;
}
}