使用Java哈希映射,即使没有;映射;?

使用Java哈希映射,即使没有;映射;?,java,data-structures,hashtable,hashmap,hash,Java,Data Structures,Hashtable,Hashmap,Hash,我希望存储一些对象,然后能够在以后尽可能高效地检索它们。在某些条件下,我还将删除其中一些。看起来哈希映射是正确的选择 但是,从我所看到的,哈希映射总是将一个值与另一个值关联起来?例如,“约翰”和他的电话号码“555-5555” 现在,我的情况。假设我有一群人,每个人都和其他人有联系。因此,我需要每个人存储其联系人 我要做的是让每个人都有一个hashmap,然后我会添加到hashOtherPerson,otherPerson中。基本上,关键是价值。我做错了吗 EDIT我认为HashSet不能解决我

我希望存储一些对象,然后能够在以后尽可能高效地检索它们。在某些条件下,我还将删除其中一些。看起来哈希映射是正确的选择

但是,从我所看到的,哈希映射总是将一个值与另一个值关联起来?例如,“约翰”和他的电话号码“555-5555”

现在,我的情况。假设我有一群人,每个人都和其他人有联系。因此,我需要每个人存储其联系人

我要做的是让每个人都有一个hashmap,然后我会添加到hashOtherPerson,otherPerson中。基本上,关键是价值。我做错了吗


EDIT我认为HashSet不能解决我的问题,因为我必须检索值来更新它,并且没有get方法。Remove返回一个布尔值,因此我甚至不能删除它以将其放回原处,这可能是一个坏主意。

我认为,您在这里寻找的数据结构应该是一个哈希集(或其他类型的集)(如果您的框架/库提供了它的话)。集合只是说“我有以下项”,而不是“我有以下项映射到以下值”。这就是你在这里做的模型


至于HashSet与其他实现(如果存在的话):这完全取决于您正在做什么。如果你需要快速查找,我。E“这个元素在集合中吗?”他问道,然后散列是一件好事。其他底层数据结构可能会更好地针对其他集合操作进行优化,例如并集、交集等。

哈希表/映射只需要您有一种方法来获取您以后感兴趣的值;这就是关键所在


然而,在你的特殊情况下,听起来你在寻找一种储存人际关系的方法,你要跟踪的是A个人是否与B个人有关系。这类事情的更好表现形式是

我是否遗漏了什么,或者你不需要一个
数组列表吗?

如果你只需要检查A是否是B的联系人之一,那么设置就是选择。为此,它有contains()

否则,最合适的可能是Map,因为您需要高效的检索操作。你说现在你使用和key和value相同的对象,但我不确定你首先是如何得到key的。假设你想从B的联系人那里获得联系人A,你使用类似“B.contacts.get(A)”,你从哪里获得A?如果你已经有了一张地图,那么从地图上再次得到它又有什么用呢?(同一个人可能有多个实例?)


除非同一个人有多个实例,否则我会说,对于每个人,定义一个类似ID的unique属性,并将其用作联系人映射的键。另外,您是否为person类定义了equal()/hashCode()?Map/Set使用hashCode()和equal()查找匹配项。根据您的使用情况,您可能需要考虑重写它们的效率。

< P>我将把联系人存储在<代码>列表中。例如

public class Person {
    private List<Person> contacts;
}
公共类人物{
私人名单联系人;
}
关于编辑个人联系人,这实际上不是家长的责任。它应该最多添加/删除联系人。通过
联系人。添加(其他人)
联系人。删除(其他人)
,您可以完美地做到这一点

当您想要编辑个人
Person
(可能是其中一个联系人)时,只需单独获取该联系人的句柄,例如
personDAO.find(personId)
,然后相应地进行更新。实际上,
人自己也有责任编辑自己的详细信息。如果发动机罩下有一个良好的ORM,这些变化将反映在其他
人员的联系人列表中

我认为HashSet不能解决我的问题,因为我必须检索值来更新它,并且没有get方法

这是一个令人费解的说法。为什么要使用
get
方法检索值来更新它?当然,如果您知道需要从集合/映射中检索哪个对象,则不需要检索它

例如:

HashSet<Person> relations = ...
Person p = ...
if (relations.remove(p)) {
    // we removed an object such that p.equals(obj) is true.
}
HashSet关系=。。。
人p=。。。
if(关系删除(p)){
//我们移除了一个对象,使得p.equals(obj)为真。
}
现在,如果您担心被移除的对象与
p
相同,但不相同,那么在我看来,您的设计似乎有问题。要么:

  • 您不应该创建多个相等的
    Person
    实例,或者
  • 您不应该关心
    Person
    实例不相同,或者
  • 您不应该重写
    等于(对象)

简而言之,问题在于您没有正确管理对象标识

> P>如果你需要遍历这些人,或者要求他们进行排序,请考虑TheMeP或TeSeSt,而不是哈希。

听起来你想要的是一组而不是一张地图。我也不会太在意散列。您使用什么语言?您将使用什么标准检索对象?这个标准听起来像是最好的散列…数组列表使用元素索引来查找它。索引对我来说并不重要,也与元素无关。我可以使用indexOf(Object),然后将结果与get一起使用,但这不是很低效吗?它不需要经过两次数据结构吗?这似乎很糟糕。我会经常这样做,所以我认为使用哈希映射会更好。可能是这样,然后你必须对它进行分析才能真正确定。此时,您正在存储联系人列表,因此ArrayList似乎是最简单的。当你测量它时,我会担心瓶颈。但是你以前的经验告诉你这会