Java Hashtable <Object,Someclass>,如果键是字符串?如果字符串相同,它将删除具有相同字符串的所有值

die*_*end 0 java string hashtable equals hashcode

我需要一个基于密钥的Someclass值.键可以是字符串,布尔值或其他对象,这就是我使用Object作为键的原因.但是当对象是一个字符串时,我有一个问题.我有两个对象的字符串,它是等于,但它应该返回不同的值,因为它是一个不同的对象.

我的代码:

Object k = new String("action");
Object l = new String("action");
Hashtable<Object,SomeClass> map = new Hashtable<Object, SomeClass>();

map.put(k,anObject1);
map.put(l,anObject2);

map.remove(k); // it is removing both with k and l.
Run Code Online (Sandbox Code Playgroud)

当我检查两个对象的hashCode()时,它返回相同的值,这最终不是我想要的.

这有什么解决方案吗?我是否需要创建一个覆盖对象的Equals()的新类?但是,仍然是hashCode.:(问题是我需要一个hashCode,为不同的Object返回不同的值.

编辑:我这样做是因为我需要根据字符串的内容执行不同的操作,但操作将因map与键返回的值而不同.

更新:好的,这就是为什么我需要这个奇怪的事情.

我有一个玩家实例和3个陆地实例.所以我希望玩家能够耕种land1,land2,land3.如果玩家想要耕种土地,那个土地会形成一个正在运行的线程,告诉玩家移动到位置X,完成工作action,并wait()通过对象action,当另一个线程按照notify对象线程时action,土地然后自行修改.然后玩家根据对象制作动画action.我正在ArrayList<Position> destination和'ArrayList action`拥有它.也许你可以在这里阅读我的其他问题.

所以我想让动作取消.我通过传递action对象来实现它.我有一个按钮,显示每个动作,每个按钮将取消该动作.我也经过action这里.因此,当我点击按钮时,土地将获得notify.问题是我无法通过ArrayList<Position>删除目的地Action,因为它不知道索引在哪里.我是Java的新手,但是我一直在使用C++,所以我考虑使用Hashtables,因为它的O(1)与C++ O(log n)不同,并且因为我当前代码没有太多变化,所以很方便.

这可以理解吗?

Col*_*inD 5

您可以使用IdentityHashMap,但如果您可以解释您在这里尝试做什么,可能会有所帮助.这不是一个非常普遍的要求,除非你有一些很好的理由要做到这一点,否则你可能还有其他的事情要做得更好.

顺便说一下,a Map只能为一个键保存一个值.所以在你第二次打电话之后map.put,你放在那里的第一个价值已经消失了.

编辑:

好的,我已经阅读了你的解释......好吧,我还不完全清楚你在做什么.这是我对你所说的最好的猜测:

  • 你有一个名为"犁"的动作,表示为String.
  • 你告诉玩家"犁"3个不同的土地.
  • 您希望能够取消对一块土地的行动而不取消其他土地的行动.
  • 要做到这一点,你试图将3个不同的String"犁" 实例映射到Position3个不同的土地的s.

如果这个(或类似的东西)是你想要做的,这是我的想法:

  • 这个动作String不应该是唯一的......"犁"是"犁",无论它在哪个地方完成.什么独特的是像"犁",而行动是要在完成土地行动的组合.
  • 鉴于此,"犁"应被视为"动作类型".使用一个enum或类似的来表示动作类型可能是好的.
  • 一个Action类应该包含一个"动作类型"和一个Position.当您单击取消该操作时Action,您可以获得所需的数据.