Java HashMap搜索

时间:2012-02-13 02:05:43

标签: java hashmap

作为正在进行的课程项目的一部分,我们被要求实施地图以实现更好的对象链接。

简而言之,我们目前有四个持有对象的arraylists

// 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>();

每个班级都有自己的领域(即,Party有“索引”,“名字”,生物有“索引”,“名字”,“年龄”,“身高”等......但他们都有唯一索引

本周我们将实现一个hashmaps,其中一个对象的键是它的索引。

所以,作为一个例子:

creatureMap.put(creature.index, creature)
...

我们的计划也允许搜索。所以我理解现在当我们通过索引进行搜索时,我们只需搜索适当的hashmap以获取我们想要的索引,并使用它的值作为对象。

但是,我们的程序还允许用户按名称,高度,重量等进行搜索。那么,如果只有在按索引搜索时它才有效,那么如何在这里有效地使用哈希图?如果我想通过名字搜索一个生物会怎么样?我必须循环遍历hashmap中的每个值,看看它的'name'字段......这正是我对arraylist所做的。

当有人问同样的问题时,我们的教授说了这个:

  

这个想法是,在第一个项目中,简单的方法是   将所有项目插入到数组列表中以及何时需要链接a   生物到一个聚会,或一个物品到一个生物,人们必须   线性搜索ArrayList,直到找到项目的索引。   如果未对ArrayList进行排序,则为O(n)操作,并且为O(log n)   如果列表已排序,则操作,但排序通常为O(n * n)   或O(n log n)取决于使用的排序操作。

     

本周,我要求您实施基于O(1)搜索系统   在地图数据结构上。因此,我们应该使用项目的索引作为   它是生成链接的关键。这在处理期间使用一次   输入文件。

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

2 个答案:

答案 0 :(得分:3)

您的理解是正确的:如果您的密钥是索引,则只能使用地图按索引进行有效查找。如果您想按名称搜索,则必须输入名称。

我不太确定你的教授对此的意思:

  

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

(我认为他指的是通过索引链接对象,如“将一个生物链接到一个聚会” - 也许他没有提到使用哈希图进行搜索)

另一方面,最好根据接口而不是具体类型声明变量。在您的示例中,您应该将列表字段定义为List而不是ArrayList

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

答案 1 :(得分:1)

按顺序运行你的问题(和陈述)......

  

所以我明白,现在当我们通过索引搜索时,我们只是搜索   我们想要的索引的适当的hashmap,并使用   对象就是它的价值。

这是正确的。

  

但是,我们的程序还允许用户按名称,身高,体重等进行搜索。那么,如果只有在按索引搜索时它才有效,那么如何在这里有效地使用哈希图?

如果你的hashmap只是通过索引存储,那么你是正确的,它无法帮助你搜索任何其他字段。您也可以为这些字段创建地图,但我认为这不是教授想要的(见下文)

  

如果我想按姓名搜索某个生物会怎样?我必须循环遍历hashmap中的每个值,看看它的'name'字段......这正是我对arraylist所做的。

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

  

当需要将一个生物链接到一个聚会或一个项目链接到一个生物时,必须线性搜索ArrayList,直到找到该项目的索引为止   ...
  因此,我们应该使用项目的索引作为生成链接的关键。在处理输入文件期间使用一次。

这告诉我,作业的另一部分 - 与从文件中读取输入,以及将派对,生物和物品连接在一起有关。

我假设聚会的输入文件是index引用的生物(同样也指参考物品的生物)。
通过使用这些哈希图,教授希望您加快这种联系 我不认为他试图让你改变其他类型的搜索方式

(显然这是猜测,因为我不知道作业实际上是什么意思)