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 に答える