在HashMap中使用相同的对象作为键和值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在HashMap中使用相同的对象作为键和值相关的知识,希望对你有一定的参考价值。

我已经尽可能多地对这次搜索进行了重复措辞,并且我没有提出任何问题,所以要么之前没有问过,要么我不知道如何问。

我正在研究一个个人项目,归结为试图找到从起始状态到完成状态的最短路径。

有太多(超过2 ^ 64)个状态,所以我无法生成整个图形。但是,每个状态都包含足够的信息来确定与其相邻的所有状态。从一个州到另一个州有(无限的)许多路径,我只对最短路径感兴趣。这需要我知道我以前是否已经到过某个州,以及我是如何第一次到达那里的。

我的状态对象包含所有状态信息,以及引导我到那里的路径的深度,以及我从该路径中的先前状态到达那里的移动。如果我按照不同的路径进入相同的状态,状态信息将是相同的,但深度和先前的移动字段将是不同的。

我想要一个数据结构,告诉我之前是否访问过该状态,如果有的话,从中检索深度和先前的状态信息。

到目前为止,我提出的最佳解决方案是使用HashMap将状态映射到状态,并使用相同的状态对象作为键和值,如:myHashMap.put(myState, myState)

我已经实现了hashCode()和equals(),这样如果两个状态的状态信息是相同的(即我们以前一直在这个房间里),两个状态将被视为“相等”,无论我如何到达那里(即哪个门我曾经进入房间)。

这似乎相当愚蠢,但我想不出另一种方式(快速存储/访问)来存储关于我是否去过某个州以及我是如何到达那里的信息。

我的计划是否有意义,还是有更好的方法?

答案

你说“我想要一个数据结构,告诉我之前是否已经访问过那个状态,如果有的话,从中检索深度和以前的状态信息。”

Set(HashSet可能比你描述的TreeSet更好)将完成第一部分。现在,我看到你正在尝试使用Map来执行检索信息的后半部分。但是,如果您已经能够检查您是否访问过某个州,那么这意味着您可以参考该州。所以,你根本不需要地图。

/*  Marking a state as visited  */
Set<State> visited = new HashSet<>();
visited.put(currentState);

/*  Checking if visited/retrieving  */
if (visited.contains(currentState)) {
    // already visited
} else {
    // do something with 'currentState'
}
另一答案

如果你发现自己将键和值存储为相同的值,那么它就是你真正需要的Set

 Set<State> set = new HashSet<>();
 set.put(stat1);

顺便说一句,你的解决方案并不是很远,因为HashSet是由幕后的HashMap支持的,这意味着HashSet具有HashMap的性能特征,并依赖于equalshashCode方法。

以上是关于在HashMap中使用相同的对象作为键和值的主要内容,如果未能解决你的问题,请参考以下文章

java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。

HashMap

与参数匹配时返回对象的键和值[重复]

将对象数组转换为包含键和值的对象作为对象数组

如何将对象数组操作为不同的键和值? [复制]

java - 如何将Java hashMap内容的全部放在另一个上,但不替换现有的键和值?