【问题标题】:Which collection to use in Java?在 Java 中使用哪个集合?
【发布时间】:2011-05-01 15:58:41
【问题描述】:

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

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

但我需要具备以下能力:

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

哪种收集模型最适合这种情况?我问是因为我看过其中的几个,没有一个可以做 部分。还是我必须编写代码来遍历每一对以查找哪个键的值为“f”?

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

【问题讨论】:

  • 每个数字都有关联的值吗?
  • 从 12 到 107 的数字每个都与一个字符串相关联
  • "jdk1.6 中没有这个功能?"没有。

标签: java collections


【解决方案1】:

Commons CollectionsGoogle Guava 都有一个双向映射。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        几个想法 1) 创建一个有 2 个映射的类,一个带有 ,另一个带有 ,这并不难实现^^

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

        杰森

        【讨论】:

          【解决方案5】:

          如果这些是带有一组固定键值对的音符,那么您可以考虑使用带有反向查找映射的enum。您仍然会得到两个 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);
              }
          }
          

          然后要获取值和符号,请使用此

          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。为符号添加另一个查找图。

          【讨论】:

            【解决方案6】:

            在另一个论坛(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);
                  }
               }
            

            应该这样做

            【讨论】:

            • HashMap 需要是 LinkedHashMap 才能双向使用。
            猜你喜欢
            • 2013-01-23
            • 2014-03-25
            • 1970-01-01
            • 2011-05-16
            • 1970-01-01
            • 2010-10-11
            • 2023-03-20
            • 2012-10-21
            • 1970-01-01
            相关资源
            最近更新 更多