Есть ли способ использования байтового массива в качестве ключа в 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, если это необходимо.
Глядя на Javadoc (я предполагаю, что это Javadoc для этого проекта, а не другой, было бы неплохо, если бы вы связались с ним) определяется конструктор, который использует Comparator<K>
. Используйте этот конструктор и передайте ему Comparator<byte[]>
который дает желаемый заказ.
MapDB предоставляет байт-компаратор сравнения: Fun.BYTE_ARRAY_COMPARATOR
Вот пример использования кода:
Map<byte[], Object> map = db.createTreeMap("map")
.comparator(Fun.BYTE_ARRAY_COMPARATOR)
.makeOrGet();
Я думаю, вы должны обернуть массив байтов в классе, который реализует 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;
}
}
Comparable
, например , вByteBuffer
или пользовательского класса - оболочки.