用于存储<string,string =“”>类型的键值对的数据结构是什么?一个键有很多值</string,>

时间:2011-03-27 10:44:53

标签: java data-structures

我的应用程序从.txt文件中读取bigram搭配(对)。它们应被视为键值对。单个键可以有多个值(因此,排除任何类型的Map作为数据结构)...我想按照自然的字母顺序对它们进行排序..

搭配的第一个词,即密钥将是一个动词,它的值将有助于动词 - 词类型的搭配。所以,树木可以被考虑

所以,基本上我正在尝试实现

SortedList <String, String> 

有点儿......

我遇到了以下适合我要求的数据结构,虽然我无法决定使用哪一个:(这里提到的MultiMap是google集合框架的一部分)

  1. HashMultiMap

  2. 尝试 - 我只知道这种数据结构的基础知识。我在Java here 中找到了它的一个实现。它没有实现delete()操作。

  3. FastTreeMap

  4. TreeMultimap

  5. SortedSetMultimap

  6. 或您想推荐的任何其他数据结构?我还没有读过Java中的字典...请帮我决定我应该选择哪一个...

    谢谢!

    编辑 - 该列表预计包含约100-200个条目

    EDIT2:操作:搜索是否存在给定键的键值映射。如前所述,dst将存储动词 - 词对的列表作为键值条目;它是通过从文件中读取条目来初始化的......工作是这样的: 我们首先从dst获取所有密钥...读取文件并对其进行标记(通过OpenNLP完成,dst不是为此)..然后搜索任何一个标记是否在dst中发出一个键(即动词) ......一旦找到,我们获取给定键的所有值,并在值集中搜索下一个标记...如果在dst中也找到该值,则表示检测到并置。然后设定值......这就是DST应该如何工作......

4 个答案:

答案 0 :(得分:2)

不是HashMapHashMultiMap,因为它们不允许您按顺序迭代密钥。

不是FastTreeMapConcurrentSkipListMap ...除非您的应用程序是多线程的。

各种TreeMapTreeMultiMap实现都可以,但TreeMap版本需要您将它们实例化为Map<String,List<String>>并管理列表。

TreeTrie相比有点困难。我怀疑一个精心设计/实现的Trie会提供更快的查找,但我也怀疑它需要更多的内存。 (我正在做一些假设。实际上,复杂性分析将取决于trie实现的细节。)

答案 1 :(得分:1)

仅供参考:Google Collections项目已停止使用,现已成为Google Guava的一部分。

Guava的ListMultimap将确保特定键中的值保持与文件中出现的顺序相同。但是,它不会使保持与文件中出现的顺序相同。

答案 2 :(得分:1)

java.util.NavigableMap是一个提供地图抽象的接口,其中包含密钥的总排序。 JavaSE 6提供java.util.TreeMapjava.util.concurrent.ConcurrentSkipListMap作为实现。前者可能足够你。为了清楚起见,我建议使用类似的东西:

Map<String,Set<String>>具有以下具体类型TreeMap<String, ArraySet<String>>

答案 3 :(得分:0)

我认为如上所述你可以使用TreeMap(取决于你的收集的大小),这将保证地图将按升序键顺序或者如果你想在TreeMap中使用自己的比较器自定义排序已创建。

final Map<String, List<String> resultMap = new TreeMap<String, List<String>>();

创建地图后,您是否会进一步更新,添加和删除地图?只是简单地穿越?我认为HashMap是理想的,如果你有很多添加,更新等。也许最初创建一个HaspMap然后将其转换为TreeMap进行遍历可能会更快?任何人?但是,如果您创建一个HaspMap考虑loadfactor,请确保您具有较高的初始容量以最小化rehash操作的数量。默认加载因子是0.75,因此如果您的初始大小为100的地图,那么在添加75个元素时,地图将被重新散列。

啊找到了另一个与HashMap loadfactor HashMap initialization parameters (load / initialcapacity)的stackoverflow链接。