我的应用程序从.txt文件中读取bigram搭配(对)。它们应被视为键值对。单个键可以有多个值(因此,排除任何类型的Map作为数据结构)...我想按照自然的字母顺序对它们进行排序..
搭配的第一个词,即密钥将是一个动词,它的值将有助于动词 - 词类型的搭配。所以,树木可以被考虑
所以,基本上我正在尝试实现
SortedList <String, String>
有点儿......
我遇到了以下适合我要求的数据结构,虽然我无法决定使用哪一个:(这里提到的MultiMap是google集合框架的一部分)
尝试 - 我只知道这种数据结构的基础知识。我在Java here 中找到了它的一个实现。它没有实现delete()操作。
或您想推荐的任何其他数据结构?我还没有读过Java中的字典...请帮我决定我应该选择哪一个...
谢谢!
编辑 - 该列表预计包含约100-200个条目
EDIT2:操作:搜索是否存在给定键的键值映射。如前所述,dst将存储动词 - 词对的列表作为键值条目;它是通过从文件中读取条目来初始化的......工作是这样的: 我们首先从dst获取所有密钥...读取文件并对其进行标记(通过OpenNLP完成,dst不是为此)..然后搜索任何一个标记是否在dst中发出一个键(即动词) ......一旦找到,我们获取给定键的所有值,并在值集中搜索下一个标记...如果在dst中也找到该值,则表示检测到并置。然后设定值......这就是DST应该如何工作......
答案 0 :(得分:2)
不是HashMap
或HashMultiMap
,因为它们不允许您按顺序迭代密钥。
不是FastTreeMap
或ConcurrentSkipListMap
...除非您的应用程序是多线程的。
各种TreeMap
或TreeMultiMap
实现都可以,但TreeMap版本需要您将它们实例化为Map<String,List<String>>
并管理列表。
Tree
与Trie
相比有点困难。我怀疑一个精心设计/实现的Trie
会提供更快的查找,但我也怀疑它需要更多的内存。 (我正在做一些假设。实际上,复杂性分析将取决于trie实现的细节。)
答案 1 :(得分:1)
仅供参考:Google Collections项目已停止使用,现已成为Google Guava的一部分。
Guava的ListMultimap将确保特定键中的值保持与文件中出现的顺序相同。但是,它不会使键保持与文件中出现的顺序相同。
答案 2 :(得分:1)
java.util.NavigableMap
是一个提供地图抽象的接口,其中包含密钥的总排序。 JavaSE 6提供java.util.TreeMap
或java.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链接。