【问题标题】:Java Random access MapJava 随机访问映射
【发布时间】:2010-11-18 16:20:34
【问题描述】:

我正在寻找一个具有随机访问映射实现的开源库。 我需要一个地图,它维护其哈希索引,但也像 LinkedHashmap 一样按插入顺序索引值,除非您不必遍历它来查找例如。元素 2. 像这样的东西:

Map m = new ArrayMap();
m.put("0", "v0");
m.put("1", "v1");
m.put("2", "v2");
m.put("3", "v3");
然后:
assertEquals("v2", m.get("2"));
assertEquals("v2", m.getAtIndex(2));

这个想法是两种类型的查找都必须快速。

快速谷歌没有找到任何东西,我没有在 Guava 或 commons 集合中看到它(我可能忽略了它)。 我现在真的没有时间正确实施它。

【问题讨论】:

  • LinkedHashMap supports m.get("2")
  • 是静态的还是动态更新的?
  • 您是否要求 'm.get(1)' 和 'm.get("key")' 都是 O(1) 的东西?地图中的“顺序”是键的顺序吗?
  • @DJClayworth 是的,是的

标签: java collections guava apache-commons-collection


【解决方案1】:

如果您的Map 可以是不可变的,您可以这样做:

ImmutableMap<String, String> map = ...
String v2 = map.entrySet().asList().get(2).getValue();

entrySet() 上的asList() 用于常规的ImmutableMap 只是直接使用地图自己的条目数组,因此它是随机访问且快速的。

【讨论】:

  • 我想人们会看到所有这些方法调用并认为它很慢,但不,它应该非常有效。
【解决方案2】:

如果您的地图是静态的或者只是偶尔更新,您可以使用LinkedHashMapvalues() 方法,它将地图的值列表作为Collection&lt;T&gt; 提供。然后您可以使用toArray(T[] a) 将集合转换为数组,并且您将可以不断访问元素,当然这会浪费一些内存来存储额外的引用,但是您要问两个特定的好复杂性,所以内存权衡是必要的。如果您在以混合方式添加值时不需要获取值,这将很好。

唯一不同的方法是自己实现LinkedHashMap,方法是使用数组而不是链表来存储插入顺序,但是当需要保持足够的性能时,您必须注意将数组列表的容量加倍很好。

【讨论】:

    【解决方案3】:

    您想以两种不同的方式查找值。最简单/最快的方法是维护两个集合,一个 Map 和一个 ArrayList。

    private final Map<String, String> map;
    private final List<String> list;
    
    public void put(String key, String value) {
       map.put(key,value);
       list.add(value);
    }
    
    public String get(String key) {
       return map.get(key);
    }
    
    public String get(int index) {
       return list.get(index);
    }
    

    【讨论】:

    • 我倾向于这个,但当然 put() 返回 Map 接口中的任何先前值,因此它(和 remove())在保持内部列表方面有点复杂最新。如果与检索相比,添加的频率足够低,您可以按照其他人的建议在每次放置/删除时重新生成整个数组。
    【解决方案4】:

    我认为 LinkedHashMap 正是你所需要的。

    您可以将其用作地图:

    map.get("v2");
    

    作为列表:

    new ArrayList(map.values().values()).get(2);
    

    如果您想编写自己的 5 行长类来实现此逻辑。

    【讨论】:

      猜你喜欢
      • 2017-10-15
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2010-09-17
      • 2017-07-22
      • 2016-01-06
      相关资源
      最近更新 更多