在Java中使用哪个集合?

时间:2010-10-28 03:02:39

标签: java collections

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

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

但我需要有能力做到以下几点:

  1. 从键中获取值:“c”= getValue(60)[给它一个键60,返回字符串值]
  2. 从值获取键:65 = getKey(“f”)[给它一个字符串值“f”,返回一个键]
  3. 哪种收藏模式最适合这种情况?我问,因为我看了几个,没有人可以做< 2>部分。或者我是否必须编写代码来遍历每一对以找到哪个键具有值“f”?

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

6 个答案:

答案 0 :(得分:14)

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

这应该