我有一些带有值的地图:
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;
}
我如何实现这个方法反之亦然?我需要从long创建一组String
更新
方法应该是这样的:
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;
}
}
答案 0 :(得分: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;
}
如果您的地图不仅包含单位设置值,则此将给出意外结果。