有没有更好的方法来实现搜索地图?

Is there a better way to implement search map?

提问人:blekione 提问时间:12/4/2015 更新时间:12/4/2015 访问量:58

问:

我有一张物体地图Members

public class Member {

int id;
String firstName;
String lastName;
String street;
String city;
...

作为键,它正在为我做工作,我不想改变地图的结构。id

我需要实现按名称搜索功能。 到目前为止,我只能想到 2 个解决方案:

第一种是迭代地图 - 不是最省时的方式

第二个是创建另一个地图,以成员的名字为键,ID作为值作为参考我的主地图,并通过这张地图搜索以找到钥匙 - 时间有效,但空间更少,这并不让我太担心

我想问一下,在我的情况下,是否有更有效(更好)的方法来实现地图搜索?

Java 字典 集合

评论


答:

6赞 rgettman 12/4/2015 #1

你说得对,遍历地图并不是最有效的方法;这将是 O(n) 和 nMembers

您正在正确的轨道上创建第二个以成员姓名为键的密钥。我要更改的是将引用也作为第二个地图的值,这样您就不必检索 ID,然后在第一个地图上执行第二次查找以检索 .这将是一个 .MapMemberMemberMap<String, Member>

评论

0赞 blekione 12/4/2015
但是,仅存储“id”比存储整个对象占用的空间更少。忽略它,@Eran回答了我这个问题。
1赞 rgettman 12/4/2015
存储密钥需要引用,但存储密钥只需要对现有对象的对象引用。idIntegerMemberMember
3赞 Eran 12/4/2015 #2

如果第二个地图需要 2 次查找(首先找到给定名称的 ID,然后找到该 ID 的 ID),那么创建第二个地图就没有意义了。Member

如果第二个 Map 将名称键映射到值(即 )。你可能会认为,与 相比,这种方法需要更多的内存,但你错了。对实例的引用与对实例的引用占用的内存量相同。仅仅因为您有两个包含相同值的 s,并不意味着需要复制实例。只有对那些 isntance 的引用才会被重复。MemberMap<String,Member>Map<String,Integer>MemberIntegerMapMember

评论

0赞 blekione 12/4/2015
是的,我有时会忘记引用是如何工作的,我认为对 Java 还是很陌生的