作为正在进行的课程项目的一部分,我们被要求实施地图以实现更好的对象链接。
简而言之,我们目前有四个持有对象的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)搜索系统 在地图数据结构上。因此,我们应该使用项目的索引作为 它是生成链接的关键。这在处理期间使用一次 输入文件。
因此,我不确定我是否正确理解了地图/键值对的概念。
答案 0 :(得分:3)
您的理解是正确的:如果您的密钥是索引,则只能使用地图按索引进行有效查找。如果您想按名称搜索,则必须输入名称。
我不太确定你的教授对此的意思:
因此,我们应该使用项目的索引作为生成链接的关键。
(我认为他指的是通过索引链接对象,如“将一个生物链接到一个聚会” - 也许他没有提到使用哈希图进行搜索)
另一方面,最好根据接口而不是具体类型声明变量。在您的示例中,您应该将列表字段定义为List
而不是ArrayList
:
private static List<Party> partyList = new ArrayList<Party>();
答案 1 :(得分:1)
按顺序运行你的问题(和陈述)......
所以我明白,现在当我们通过索引搜索时,我们只是搜索 我们想要的索引的适当的hashmap,并使用 对象就是它的价值。
这是正确的。
但是,我们的程序还允许用户按名称,身高,体重等进行搜索。那么,如果只有在按索引搜索时它才有效,那么如何在这里有效地使用哈希图?
如果你的hashmap只是通过索引存储,那么你是正确的,它无法帮助你搜索任何其他字段。您也可以为这些字段创建地图,但我认为这不是教授想要的(见下文)
如果我想按姓名搜索某个生物会怎样?我必须循环遍历hashmap中的每个值,看看它的'name'字段......这正是我对arraylist所做的。
是的,如果您需要按名称搜索,那么您将使用values()
方法并重复检查每个项目。
当需要将一个生物链接到一个聚会或一个项目链接到一个生物时,必须线性搜索ArrayList,直到找到该项目的索引为止 ...
因此,我们应该使用项目的索引作为生成链接的关键。在处理输入文件期间使用一次。
这告诉我,作业的另一部分 - 与从文件中读取输入,以及将派对,生物和物品连接在一起有关。
我假设聚会的输入文件是index
引用的生物(同样也指参考物品的生物)。
通过使用这些哈希图,教授希望您加快这种联系
我不认为他试图让你改变其他类型的搜索方式
(显然这是猜测,因为我不知道作业实际上是什么意思)