Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java哈希表<;对象,Someclass>;,如果键是字符串?如果字符串相同,它将删除具有相同字符串的所有值_Java_String_Hashtable_Equals_Hashcode - Fatal编程技术网

Java哈希表<;对象,Someclass>;,如果键是字符串?如果字符串相同,它将删除具有相同字符串的所有值

Java哈希表<;对象,Someclass>;,如果键是字符串?如果字符串相同,它将删除具有相同字符串的所有值,java,string,hashtable,equals,hashcode,Java,String,Hashtable,Equals,Hashcode,我需要一个基于键的Someclass值。键可以是字符串、布尔值或其他对象,这就是我使用对象作为键的原因。但我有一个问题,当对象是字符串时。我有两个string对象,它是相等的,但它应该返回不同的值,因为它是一个不同的对象 我拥有的代码: Object k = new String("action"); Object l = new String("action"); Hashtable<Object,SomeClass> map = new Hashtable<Object,

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

我拥有的代码:

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.
objectk=新字符串(“动作”);
对象l=新字符串(“操作”);
Hashtable map=新的Hashtable();
map.put(k,anObject1);
map.put(l,一个对象2);
映射。删除(k);//它将同时使用k和l进行删除。
当我检查这两个对象的hashCode()时,它返回相同的值,这最终不是我想要的

有什么解决办法吗?我是否需要创建一个重写object的Equals()的新类?但是,哈希代码仍然是:(问题是我需要一个哈希代码,它为不同的对象返回不同的值

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

更新: 好吧,这就是为什么我需要这个奇怪的东西的全部故事

我有一个玩家实例和3个陆地实例。所以我想让玩家犁地1,2,3。如果玩家想要犁地,那块地会形成一条运行的线,告诉玩家移动到位置
X
,然后执行作业
动作
,和
等待()
通过对象
动作
,当另一个线程
通过对象
动作
通知该线程时,陆地会自行修改。然后,播放器会根据对象
动作
制作动画。我有
ArrayList目的地
和“ArrayList动作”来拥有它。也许你可以阅读我的其他问题关于这件事

所以我想让这个动作可以取消。我通过传递
动作
对象来实现它。我有一个按钮显示每个动作,每个按钮都会取消这个动作。我也在这里传递
动作
。所以当我点击按钮时,土地会得到
通知
。问题是我不能做
AdLeList<代码> >通过代码>动作< /C> >删除目标,因为它不知道索引在哪里。我是java新手,但C++使用了很多,所以我想使用HasSt表,因为它的O(1)与C++(log n)不同,而且方便,因为我的当前代码没有太多的变化。
这可以理解吗?

你可以用一个来代替,不过如果你能解释一下你在这里到底想做什么可能会有所帮助。这不是一个非常普遍的要求,除非你有很好的理由想这样做,否则你最好做些别的事情

顺便说一句,
Map
只能为一个键保存一个值。因此,在您第二次调用
Map.put
之后,您在其中输入的第一个值已经消失了

编辑:

好的,我已经读了你的解释,而且…嗯,我仍然不完全清楚你在做什么。下面是我根据你所说的最好的猜测:

  • 您有一个名为“犁”的操作,表示为
    字符串
  • 你告诉玩家“犁”3块不同的土地
  • 您希望能够为一块土地取消该操作,而不为其他土地取消该操作
  • 为此,您尝试将
    字符串的3个不同实例映射到3个不同土地的
    位置
如果这(或类似的事情)是你想要做的,以下是我的想法:

  • 动作
    String
    不应该是唯一的…“犁”是“犁”,不管它在什么土地上进行。唯一的是像“犁”这样的动作和要在什么土地上进行动作的组合
  • 考虑到这一点,“plow”应该被视为类似于“action type”的东西。最好使用
    enum
    或类似的方法来表示action type
  • 动作
    类应该包含一个“动作类型”和一个
    位置
    。当您单击取消该
    动作
    时,您的数据就在那里

字符串类重写equals()和hashCode(),使两个具有相同字符的字符串具有相同的hashCode(),并且相等。但是对象类本身有一个equals()方法,对于两个不同的对象,该方法永远不会返回true。这实际上是不必要的(也不可能!)为了使hashcode是唯一的,它们只需要在可能的值范围内很好地分布


所以在任何情况下:字符串都不适合您的要求,我同意;但是任何其他类的对象都不能覆盖equals()和hashCode()你可以考虑创建一个自己的类来代表一个键,用一个唯一的标识符来定义自己的哈希代码。也许使用原子长

这是hhMAP的语义:键是UNQEE,每个关键域的值映射到至多< /强> Hash映射中的一个值。


把它想象成一个数组,只是数组不是由数字索引的,而是由任意对象索引的。一个数组中的同一索引不能有多个不同的值。

如果任何内部字符串最终被用作keys@Justin:是,但如果您使用的是
新Stri,则不可能这样做ng(…)
创建每个键。@dieend:请注意注意注意注意事项。它确实有效,但您可能不应该这样做。@ColinD为什么我不应该这样做?@Kirk Woll说同样的话。@dieend:因为两个具有完全相同字符的
字符串
对象应该始终被认为是相同的。它们是相同的。您需要按住to引用这些精确的
字符串
对象,以便能够