2

私は値を持ついくつかのマップを持っています:

private static Map<String, Long> hodnotyUdaju = new HashMap<String, Long>();

static {
    hodnotyUdaju.put("a", 1L);
    hodnotyUdaju.put("b", 2L);
    hodnotyUdaju.put("b", 4L);
    hodnotyUdaju.put("d", 8L);
    hodnotyUdaju.put("e", 16L);
    hodnotyUdaju.put("f", 32L);
    hodnotyUdaju.put("g", 64L);
    hodnotyUdaju.put("h", 128L);
    hodnotyUdaju.put("i", 256L);
    hodnotyUdaju.put("j", 512L);
    .
    .
    .
}

値のセットを long に変換するメソッド

public static long bitovaHodnotaSeznamuUdaju(Set<String> udaje) {
    long bitovaHodnota = 0;

    for (String udaj : udaje) {
        Long tmp = hodnotyUdaju.get(udaj);
        if (tmp != null)
            bitovaHodnota += tmp;
    }

    return bitovaHodnota;
}

このメソッドを逆に実装するにはどうすればよいですか? 文字列のセットセットを作成するには長い必要があります

アップデート

メソッドは次のようになります。

public static Set<String> bin2Udaje(long binUdaje) {
    Set<String> udaje = new HashSet<String>();
    for (Map.Entry<String, Long> entry : hodnotyUdaju.entrySet()) {
        if (udaje some operation entry.getValue() ) {
            udaje.add(entry.getKey());
        }
        return udaje;

    }
}
4

1 に答える 1

4

Enumこれには、マップの代わりに を使用する必要があるようです。たとえば、値 1、2、4、8 を使用することが保証されていますが、最終的には明確な答えになりますが、一般的なマップでそれを行うとうまくいきません。

必要に応じて、文字列に追加の値を持つ列挙型を使用することをお勧めします。本当に必要な場合は、値1L << value.ordinal()を取得するために使用できlongます。ただし、これらの値の一般的なセットを表すには、単純に を使用できますEnumSet

これ適切でない場合は、さらに情報を提供してください。

編集:既存の構造に固執したい場合は次を使用できます。

public static Set<String> valueToKeySet(long value) {
    Set<String> keys = new HashSet<String>();
    for (Map.Entry<String, Long> entry : hodnotyUdaju.entrySet()) {
        if ((value & entry.getValue()) != 0) {
            keys.add(entry.getKey());
        }
    }
    return keys;
}

マップに単一ビット セットの値しか含まれていない場合、これは予期しない結果をもたらします。

于 2012-06-05T08:48:12.357 に答える