【问题标题】:Store in a map a key with multiple values在地图中存储具有多个值的键
【发布时间】:2013-04-11 18:04:39
【问题描述】:

我想在地图键中存储多个值。 例如:我正在从一个 ArrayList 读取字符串的键,从另一个 ArrayList 读取整数的值:

Keys                     Values
humans                   50
elfs                     20
dwarfs                   30
humans                   40
elfs                     10

我想像这样存储这些信息:Map >

[humans = {50,40}]
[elfs = {20,10}]
[dwarfs = {30}]

有可能这样做吗?

【问题讨论】:

  • Map < String, ArrayList < Integer>> 有什么问题?
  • 我会说“数组”是不需要的 :)

标签: java collections


【解决方案1】:

我建议使用Guava MultiMap。或者,您的

Map<String, ArrayList<Integer>>

也将实现这一点。在做put的时候,判断是否已经有一个与key关联的list;如果有,那么您的put 将是get(key).add(value),否则它将是put(new List(value))。同样,remove 将从关联列表中删除一个值,否则如果这将导致一个空列表,则将完全删除该列表。

另外,Map&lt;String, HashSet&lt;Integer&gt;&gt; 可能会比列表映射产生更好的性能;如果您想将重复值与键关联,显然不要这样做。

【讨论】:

  • 你能解释一下 Guava Multimap 在哪些方面比其他的更好吗?
  • 已经实现和测试,所以从长远来看会节省时间。
  • 我一直使用List策略的地图。有时它更令人困惑,但从好的方面来说,它减少了需要担心的类路径依赖。
  • 应该是Map&lt;String, List&lt;Integer&gt;&gt;,而不是ArrayList。
【解决方案2】:

我这样做:

public class StringToListInt {
    private Map<String, List<Integer>> stringToListInt;

    public StringToListInt() {
        stringToListInt = new HashMap<String, List<Integer>>();
    }

    public void addInt( String string, Integer someValue ) {
        List<Integer> listInt = stringToListInt.get( string );
        if ( listInt == null ) {
            listInt = new ArrayList<String>();
            stringToListInt.put( string, listInt );
        }
        listInt.add( someValue );
    }

    public List<Integer> getInts( String string ) {
        return stringToListInt.get( string );
    }
}

如果你添加一些泛型,我想你最终会得到与 Guava 的 MultiMap 非常相似的东西,而没有依赖。

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多