作为正在进行的类项目的一部分,我们被要求实现地图以获得更好的对象链接。Java HashMap搜索
总之,我们目前已持有对象的四个的ArrayList
// Array Lists used for sorting.
private static ArrayList<Party> partyList = new ArrayList<Party>();
private static ArrayList<Creature> creatureList = new ArrayList<Creature>();
private static ArrayList<Treasure> treasureList = new ArrayList<Treasure>();
private static ArrayList<Artifact> artifactList = new ArrayList<Artifact>();
每个职业都有自己的领域(即,方有“指标”,“姓名”,生物具有“指标”,“名” ,“年龄”,高度”,等等...但他们都有一个唯一索引)这个星期我们要实现包含HashMap,其中一个对象的关键,是它的索引
。
所以,作为例子:
creatureMap.put(creature.index, creature)
...
我们的程序还允许搜索。所以我明白,现在当我们通过索引进行搜索时,我们只是搜索适合我们需要的索引的散列表,并使用它的值作为对象。
但是,我们的程序还允许用户通过名称,身高,体重等进行搜索。那么,如果hashmaps只有在通过索引进行搜索时才有用,那么如何有效地使用hashmaps呢?如果我想按名称搜索一个生物会发生什么?我将不得不循环hashmap中的每个值,看看它的'名称'字段......这正是我正在处理的数组列表。
我们的教授说这话的时候有人问过类似的问题:
的想法是,在第一个项目,简单的办法是 插入所有项目到数组列表,当一个需要链接 生物到派对或物品到生物时,必须线性搜索ArrayList,直到找到物品的索引。 这是O(n)操作,如果ArrayList未排序,并且O(log n)操作(如果列表已排序,但排序通常为O(n * n) 或O(n log n))在使用的分拣操作上。
本周,我要求您在地图数据结构上实施基于 的O(1)搜索系统。因此,我们应该使用一个项目的索引作为 它的关键来生成链接。这在处理 输入文件时使用一次。
因此,我不确定我是否正确理解地图/键值对的概念。
的确。输入文件包含我们创建对象的行。例如(p:001:周末战士),该行告诉我们要创建一个聚会对象,它的索引是001,它的名字是周末战士。同样的,一个生物会是这样的,但它也会有另一个索引,它就是它所属的派对。(c:250:conan:001) – sqram 2012-02-13 02:28:47
对。因此,对于List版本的代码,您必须遍历列表才能找到聚会#001,这会让您的文件读取代码相对较慢(当您有很多参与者循环时)。地图版本将通过执行索引[O(1)]查找而不是迭代[O(n)]查找来加速文件读取代码。 – Tim 2012-02-13 02:34:20
谢谢。希望我能接受两个答案= | – sqram 2012-02-13 02:37:00