是否有任何方法可以在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();如果需要,可以在番石榴图书馆找到使用过的比较器。
发布于 2014-07-10 07:28:34
看看Javadoc (我想它是该项目的Javadoc,而不是另一个项目,如果您能链接到它会很好),这里定义了一个采用构造函数的Comparator<K>。使用这个构造函数,并传递给它一个Comparator<byte[]>,它给出了您想要的顺序。
发布于 2014-07-10 16:58:57
MapDB提供byte[]数组比较器: Fun.BYTE_ARRAY_COMPARATOR
下面是如何在代码中使用的示例:
Map<byte[], Object> map = db.createTreeMap("map")
.comparator(Fun.BYTE_ARRAY_COMPARATOR)
.makeOrGet();发布于 2014-07-10 07:29:13
我认为您必须将字节数组包装在实现可比较的类中:
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;
}
}https://stackoverflow.com/questions/24670628
复制相似问题