2012-02-13 78 views
1

作为正在进行的类项目的一部分,我们被要求实现地图以获得更好的对象链接。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)搜索系统。因此,我们应该使用一个项目的索引作为 它的关键来生成链接。这在处理 输入文件时使用一次。

因此,我不确定我是否正确理解地图/键值对的概念。

回答

3

你的理解是正确的:如果你的密钥是一个索引,你只能使用该索引来高效地查找索引。如果你想按名称搜索,那么你必须键入名称。

我不是这个意思是什么你的教授太相信:

因此,我们应该用一个项目的索引作为其键生成的链接。

(我想他指的是通过索引链接对象,如“链接生物的一方” - 也许他没有提及使用包含HashMap的搜索)

在一个侧面说明,根据接口而不是具体类型声明变量是一种很好的做法。在你的榜样,你应该定义你的清单领域List而不是ArrayList

private static List<Party> partyList = new ArrayList<Party>(); 
1

通过您的问题(和报表),以便运行....

让我明白,现在,当我们按索引搜索,我们只需搜索 适合我们需要的索引的散列表,并使用其值为 的对象。

这是正确的。

然而,我们的程序还允许用户通过姓名,身高,体重,搜索等,所以,如何被使用效率些,如果只通过索引搜索时帮助包含HashMap?

如果你的hashmap只是通过索引存储,那么你是正确的,它不能帮助你通过任何其他字段进行搜索。您可以创建一个映射这些字段还可以,但我不认为这是你的教授希望(见下文)

,如果我想按名称搜索的生物,会发生什么呢?我将不得不循环hashmap中的每个值,看看它的'名称'字段......这正是我正在处理的数组列表。

是的,如果您需要按名称搜索,那么您将使用values()方法并遍历该方法,检查每个项目。

当一个人需要一个生物链接到当事人,或对生物的项目,一个人必须要线性搜索的ArrayList,直到该项目的索引被发现
...
因此,我们应该使用项目的索引作为其关键字来生成链接。这在输入文件的处理过程中使用一次。

这暗示了我的另一部分任务 - 与读取来自文件的输入以及将各方,生物和物品连接在一起。

我假设参与派对的输入文件通过index来引用生物(同样对于生物来说也是指物品)。
教授要你用这些hashmaps加速的联动。
我不认为他是试图让你的方式来改变其他类型的搜索作品

(显然,这是一种猜测,因为我不知道该怎么分配实际上说的)

+0

的确。输入文件包含我们创建对象的行。例如(p:001:周末战士),该行告诉我们要创建一个聚会对象,它的索引是001,它的名字是周末战士。同样的,一个生物会是这样的,但它也会有另一个索引,它就是它所属的派对。(c:250:conan:001) – sqram 2012-02-13 02:28:47

+2

对。因此,对于List版本的代码,您必须遍历列表才能找到聚会#001,这会让您的文件读取代码相对较慢(当您有很多参与者循环时)。地图版本将通过执行索引[O(1)]查找而不是迭代[O(n)]查找来加速文件读取代码。 – Tim 2012-02-13 02:34:20

+0

谢谢。希望我能接受两个答案= | – sqram 2012-02-13 02:37:00