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);
    .
    .
    .
}

以及将一组值转换为长整数的方法

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 回答