2010-10-28 70 views
3

我想整数映射到字符串,它们是一对的,如:在Java中使用哪个集合?

60 : c 
61 : c# 
62 : d 
63 : d# 
64 : e 
65 : f 
66 : f# 

但我需要做以下的能力:

  1. 获取从一个值key:“c”= getValue(60)[给它一个键60,返回字符串值]
  2. 从键值获得键值:65 = getKey(“f”)[给它一个字符串值“f”,返回a键]

哪个集合模型最适合这个?我问,因为我已经看过其中的几个,没有人能做到这一点。或者我必须编写代码才能通过每一对来找出哪个键的值为“f”?

编辑:没有在jdk1.6做到这一点?

+0

是否每个号有一个相关的价值? – 2010-10-28 03:07:38

+0

从12到107的数字每个都与一个字符串相关联 – Frank 2010-10-28 03:09:52

+1

“jdk1.6中没有任何内容会执行此操作?”不。 – Thilo 2010-10-28 03:27:32

回答

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

这应该做

+0

'HashMap'需要是一个'LinkedHashMap'用于双向使用。 – 2010-10-28 07:03:04

+0

简单和点我的问题的答案,谢谢! – Frank 2010-10-28 15:01:56

5

你需要的是一个BiMap。谷歌guava库提供了这个集合。

6

如果您不想包含公用集合或番石榴,只需使用两个单独的地图 - 您可以通过一个简单的foreach循环以编程方式创建反向映射。我会建议设计你的代码,以便所有对这些映射的访问都是在一个类内部的(因为它是一个实现细节,应该从系统的其他部分隐藏)。换句话说,不要将这些地图传递给任何方法。然后,你可以很容易地切换到更适当的收集,如果你以后选择。

1

嗨 我想插一两件事情 Java中的标准地图单向工作:给一键获取对象(S) 我不知道一个Java JDK1.6的类,它的它

一对夫妇的想法 1)创建一个具有2个映射一个与和其他与一类,这并不难实现^^

2)如果您的数据都是喜欢你的贴如果这是一个预定义的关联列表,为什么不尝试枚举?或一个ArrayList?

杰森

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。为符号添加其他查找映射。