Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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 HashMap查找在相同的键上失败_Java_Hashmap - Fatal编程技术网

Java HashMap查找在相同的键上失败

Java HashMap查找在相同的键上失败,java,hashmap,Java,Hashmap,我有一个小错误,可能是因为我对HashMap的误解,它要了我的命。我已经包含了一小段测试代码来说明这个问题 为了简洁起见,我省略了Prefix类,但我的前缀只是单词数组。它们是不可变的,因此在构造它们时,它们会克隆传递到构造函数中的字符串数组Hashcode()和equals()方法被实现,因此条件传递。本质上,问题是我只能使用prefix1而不是prefix2来取消对后缀列表的引用(在后一种情况下返回null) 仅供参考,我的Hashmap仅声明为: // Stores mappings be

我有一个小错误,可能是因为我对HashMap的误解,它要了我的命。我已经包含了一小段测试代码来说明这个问题

为了简洁起见,我省略了Prefix类,但我的前缀只是单词数组。它们是不可变的,因此在构造它们时,它们会克隆传递到构造函数中的字符串数组
Hashcode()
equals()
方法被实现,因此条件传递。本质上,问题是我只能使用prefix1而不是prefix2来取消对后缀列表的引用(在后一种情况下返回null)

仅供参考,我的Hashmap仅声明为:

// Stores mappings between "prefixes" (consecutive word phrases) and "suffixes" (successor words).
private Map<Prefix, ArrayList<String>> prefixSuffixPairs;
//存储“前缀”(连续词短语)和“后缀”(后续词)之间的映射。
私有映射前缀suffix对;
感谢您的帮助

   ArrayList<String> suffixInList = new ArrayList<String>();
   suffixInList.add("Suffix1");
   suffixInList.add("Suffix2");

   String[] prefixWords1 = new String[] {"big", "the"}; 
   Prefix prefix1 = new Prefix(prefixWords1);

   String[] prefixWords2 = new String[] {"big", "the"}; 
   Prefix prefix2 = new Prefix(prefixWords2);

   prefixSuffixPairs.put(prefix1, suffixInList);

   if(prefix1.hashCode() == prefix2.hashCode()) {
      System.out.println("HASH CODE MATCH");
   }

   if(prefix1.equals(prefix2)) {
      System.out.println("VALUES MATCH");
   }

   ArrayList<String> suffixOutList = null;
   suffixOutList = prefixSuffixPairs.get(prefix2);
   suffixOutList = prefixSuffixPairs.get(prefix1);   

  public int hashCode() {

  int result = 1;
  for( int i = 0; i< words.length; i++ )
  {
      result = result * HASH_PRIME + words[i].hashCode();
  }

  return result;
  }

  public boolean equals(Prefix prefix) {

  if(prefix.words.length != words.length) {
     return false;
  }

  for(int i = 0; i < words.length; i++) {
     if(!prefix.words[i].equals(words[i])) {
        return false;
     }
  }

  return true;
  } 
ArrayList后缀列表=新建ArrayList();
后缀列表。添加(“后缀1”);
suffixInList.添加(“Suffix2”);
字符串[]前缀词1=新字符串[]{“大”,“the”};
Prefix prefix1=新前缀(prefixWords1);
字符串[]前缀词2=新字符串[]{“大”,“the”};
Prefix prefix2=新前缀(prefixWords2);
prefixSuffixPairs.put(prefix1,后缀列表);
if(prefix1.hashCode()==prefix2.hashCode()){
System.out.println(“哈希代码匹配”);
}
if(prefix1.等于(prefix2)){
System.out.println(“值匹配”);
}
ArrayList-suffixOutList=null;
suffixOutList=prefixSuffixPairs.get(prefix2);
suffixOutList=prefixSuffixPairs.get(prefix1);
公共int hashCode(){
int结果=1;
for(int i=0;i
它不会覆盖对象#equals(因此HashMap不会使用它)

您只是提供了一个同名的无关方法(重载)——但您可以从下面的方法调用它:

试一试

严格来说,
@Override
不是必需的,但是如果您将它应用于第一个方法,编译器将能够检测到这个问题(当您的Override断言错误时,您会得到一个错误)

它不会覆盖对象#equals(因此HashMap不会使用它)

您只是提供了一个同名的无关方法(重载)——但您可以从下面的方法调用它:

试一试


@Override
并不是绝对必要的,但是如果您将它应用于第一个方法,编译器就可以检测到这个问题(当您的Override断言错误时,您会得到一个错误)。

Prefix
类中,equals方法是重载还是重载?show us
hashCode()
前缀中的
等于()class@Thomas如果equals的签名是
boolean equals(前缀p)
,那么它将不起作用。这就是
@Override
注释的作用。始终将其用于您打算重写某些内容的方法。它将捕获
equals(前缀p)
问题。@tobias_k这些方法的实现被认为是正确的(由上面的
if
条件断言)。当前的想法是
equals
没有覆盖正确的方法。在
Prefix
类中,equals方法是重载还是重写了?告诉我们
hashCode()
equals())
在您的
前缀中
class@Thomas如果equals的签名是
boolean equals(前缀p)
,那么它将不起作用。这就是
@Override
注释的作用。始终将其用于您打算重写某些内容的方法。它将捕获
equals(前缀p)
问题。@tobias_k这些方法的实现应该是正确的(由上面的
if
条件断言).目前的想法是,
equals
不会覆盖正确的方法。=始终使用
@override
。就是这样。谢谢,蒂洛。我知道这是一件愚蠢的事情。如果他们要重新设计Java,
override
可能是一个方法修饰符关键字,如
final
,并且是强制性的(不是可选注释)它是在一些新的语言中。至少有一个不错的IDE,它为你填充了<代码> @凌驾。来自C++,C背景,我认为它会工作。我不认为它会在C++中工作。我不确定C,但是我怀疑它总是使用<代码> @凌驾< /Calp>。就是这样。谢谢,Thilo。我知道这是个笨拙的东西。如果是的话。要再次设计Java,
override
可能是一个方法修饰符关键字,如
final
,并且是必需的(不是可选的注释)它是在一些新的语言中。至少有一个好的IDE,它为你填写<代码> @凌驾。来自C++、C背景的我是如何期望它工作的。我认为它不会在C++中工作。对C语言不确定,但我怀疑它。
public boolean equals(Prefix prefix) {
@Override
public boolean equals(Object prefix) {