在Java中使用哪个集合?

在Java中使用哪个集合?,java,collections,Java,Collections,我想将整数映射到字符串,它们是一对一的,例如: 60 : c 61 : c# 62 : d 63 : d# 64 : e 65 : f 66 : f# 但我需要具备以下能力: 从键获取值:“c”=getValue(60)[给它一个键60,返回字符串值] 从值获取键:65=getKey(“f”)[给它一个字符串值“f”,返回一个键] 哪种收集模式最适合这种情况?我这么问是因为我已经看过好几个了,没有一个能胜任这个角色。还是我必须编写代码来遍历每一对,以找到哪个键的值为“f” 编辑:jdk1.6中

我想将整数映射到字符串,它们是一对一的,例如:

60 : c
61 : c#
62 : d
63 : d#
64 : e
65 : f
66 : f#
但我需要具备以下能力:

  • 从键获取值:“c”=getValue(60)[给它一个键60,返回字符串值]
  • 从值获取键:65=getKey(“f”)[给它一个字符串值“f”,返回一个键]
  • 哪种收集模式最适合这种情况?我这么问是因为我已经看过好几个了,没有一个能胜任这个角色。还是我必须编写代码来遍历每一对,以找到哪个键的值为“f”


    编辑:jdk1.6中没有这样做的?

    并且两者都有一个双向映射。

    您需要的是一个BiMap。google guava library提供了这个集合。

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

    Hi 我想插几句话 Java中的标准映射是单向工作的:给一个键获取对象 我不知道有一个JavaJDK1.6类可以做到这一点

    一些想法 1) 创建一个具有两个映射的类,一个映射为,另一个映射为,这并不难实现^^

    2) 如果您的数据与发布的数据相似,并且这是一个预定义的关联列表,为什么不尝试使用枚举?还是一个ArrayList


    杰森

    < P>如果这些音符有一组固定的键值对,那么你可以考虑使用<代码> EnUM < /C>使用反向查找图。您仍然会得到两个hashmap,但至少它们在枚举中连接在一起

    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);
        }
    }
    
    这将导致

    CSHARP
    C#
    61
    C#
    
    PS.为了简洁起见,删除了修改器。
    PSS。添加符号的其他查找地图。

    在另一个论坛()中找到此地图


    这应该可以

    每个数字都有关联值吗?从12到107的数字都与字符串“jdk1.6中没有任何东西可以这样做?”相关联。不。
    HashMap
    需要是
    LinkedHashMap
    才能双向使用。
    CSHARP
    C#
    61
    C#
    
        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);
          }
       }