Как использовать байтовый массив в качестве ключа в реализации BTreeMap MapDB

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, если это необходимо.

  • 0
    Используйте класс - оболочку для байтовых массивов , который реализует Comparable , например , в ByteBuffer или пользовательского класса - оболочки.
Теги:
mapdb

3 ответа

1
Лучший ответ

Глядя на Javadoc (я предполагаю, что это Javadoc для этого проекта, а не другой, было бы неплохо, если бы вы связались с ним) определяется конструктор, который использует Comparator<K>. Используйте этот конструктор и передайте ему Comparator<byte[]> который дает желаемый заказ.

  • 0
    Кроме того, комментарий Томаса также является допустимым вариантом (но я бы предпочел иметь дело непосредственно с необработанными типами, а не с обертками).
2

MapDB предоставляет байт-компаратор сравнения: Fun.BYTE_ARRAY_COMPARATOR

Вот пример использования кода:

   Map<byte[], Object> map = db.createTreeMap("map")
               .comparator(Fun.BYTE_ARRAY_COMPARATOR)
               .makeOrGet();
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;
    }

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню