我想将整数映射到字符串,它们是一对一的,例如:
60 : c
61 : c#
62 : d
63 : d#
64 : e
65 : f
66 : f#
但我需要有能力做到以下几点:
哪种收藏模式最适合这种情况?我问,因为我看了几个,没有人可以做< 2>部分。或者我是否必须编写代码来遍历每一对以找到哪个键具有值“f”?
编辑:jdk1.6中没有这样做吗?
答案 0 :(得分:14)
Commons Collections和Google Guava都有双向地图。
答案 1 :(得分:6)
如果您不想包含公共集合或番石榴,只需使用两个单独的地图 - 您可以通过简单的foreach循环以编程方式创建反向映射。我建议您设计代码,以便对这些映射的所有访问都是单个类的内部(因为它是一个实现细节,应该从系统的其余部分隐藏)。换句话说,不要将这些映射传递给任何方法。然后,如果您以后选择,可以非常轻松地切换到更合适的集合。
答案 2 :(得分:5)
你需要的是一个BiMap。 google guava库提供此系列。
答案 3 :(得分:1)
您好 我想插入一些东西 Java中的标准映射单向工作:给出一个键获取对象 我不知道有一个java jdk1.6类来做它
一些想法 1)创建一个具有2个映射的类,其中包含一个和另一个,这不是很难实现^^
2)如果您的数据与发布的数据类似,如果这是预定义的关联列表,为什么不尝试枚举?还是一个ArrayList?
杰森
答案 4 :(得分:1)
如果这些是具有固定键值对的音符,那么您可以考虑将enum
与反向查找映射一起使用。你仍然会得到两个HashMaps,但至少它们在枚举中连接在一起。
enum Note {
C("C",60), CSHARP("C#",61), D("D",62), DSHARP("D#",63); //etc..
final int value;
final String symbol;
static final Map<Integer, Note> lookup = new HashMap<Integer, Note>();
static {
for(Note n : Note.values()) {
lookup.put(n.value, n);
}
}
Note(String symbol, int value) {
this.symbol = symbol;
this.value = value;
}
static Note get(int i) {
return lookup.get(i);
}
}
然后获取值和符号,请使用此
System.out.println(Note.get(61));
System.out.println(Note.get(61).symbol);
System.out.println(Note.CSHARP.value);
System.out.println(Note.CSHARP.symbol);
将导致
CSHARP
C#
61
C#
PS。为简洁起见,删除了修饰符。 PSS。添加符号的其他查找映射。
答案 5 :(得分:0)
在另一个论坛(link text)
中找到了这个 public class ReversibleMap {
private final Map keyToValue = new HashMap(8);
private final Map valueToKey = new HashMap(8);
public void put(Integer key, String value) {
keyToValue.put(key, value);
valueToKey.put(value, key);
}
public String get(Integer key) {
return (String) keyToValue.get(key);
}
public Integer getKey(String value) {
return (Integer) valueToKey.get(value);
}
}
这应该