Java 返回意外结果的哈希代码

Java 返回意外结果的哈希代码,java,hashcode,Java,Hashcode,我试图使用哈希表(我必须使用哈希)来存储电话目录。我想根据姓氏(字母顺序)对电话条目进行排序。我决定使用条目中姓氏第一个字符的哈希代码作为哈希表的键 这是我在Entry类中编写的哈希代码: @覆盖 公共int hashCode(){ int index=getnamese().charAt(0); 收益指数; } 这是addEntry方法,用于向目录添加新条目: @覆盖 公共作废补遗(条目行){ //如果姓氏、首字母或数字为null,则引发异常。 if(line.getnamese()==nu

我试图使用哈希表(我必须使用哈希)来存储电话目录。我想根据姓氏(字母顺序)对电话条目进行排序。我决定使用条目中姓氏第一个字符的哈希代码作为哈希表的键

这是我在Entry类中编写的哈希代码:

@覆盖
公共int hashCode(){
int index=getnamese().charAt(0);
收益指数;
}
这是addEntry方法,用于向目录添加新条目:

@覆盖
公共作废补遗(条目行){
//如果姓氏、首字母或数字为null,则引发异常。
if(line.getnamese()==null | | line.getInitial()==null | | | line.getNumber()==null){
抛出新的IllegalArgumentException(“请提供姓氏、首字母和数字”);
}
//如果首字母小于2,则引发异常
if(line.getInitial().length()<2){
抛出新的IllegalArgumentException(“请确保首字母同时包含名字和姓氏,如:AK”);
}
//如果数字长度不是5个字符,则引发异常。
if(line.getNumber().length()!=5){
抛出新的IllegalArgumentException(“请提供一个5个字符长的数字(确保以0开头)”;
}
//如果数字不是以0开头,则引发异常。
if(line.getNumber().startsWith(“0”)==false){
抛出新的IllegalArgumentException(“数字必须以0开头”);
}
//使用姓氏的哈希代码初始化密钥。
int key=line.getNames().hashCode();
//If语句检查哈希表条目是否包含该键
if(条目.包含(键)){
//如果这样做,它将创建一个名为list的linkedList
LinkedList=新建LinkedList();
列表=条目。获取(键);
ListIterator迭代器=list.ListIterator();
while(iterator.hasNext()){
int x=0;
stringone=list.get(x.getnam姓氏();
if(一个.compareToIgnoreCase(line.getNastname())>0){
条目。放置(x,列表);
x++;
打破
}
}
}否则{
LinkedList list2=新建LinkedList();
列表2.添加(行);
条目。放置(键,列表2);
}
}
问题是,当我进行一些测试以查看添加不同条目的结果时,我发现键(hashCode)没有正确生成

结果如下:

Key: -2083437938. Value: [Entry{surname='Jansas initials=KJ Phone number=05544'}]
Key: -1911680082. Value: [Entry{surname='Paul initials=AP Phone number=05572'}]
Key: 66344. Value: [Entry{surname='Aza initials=AZ Phone number=05212'}]
Key: 867699843. Value: [Entry{surname='Penny initials=KP Phone number=05271'}]
Key: 1953849949. Value: [Entry{surname='Aanais initials=AP Phone number=05562'}]
姓“Aza”的条目不应该在“Penny”上方,在“Aanais”旁边吗?关于如何解决这个问题,你有什么想法吗?

你写道

。。。
int key=line.getNames().hashCode();
...
当我正确地看到它时,
变量的类型是
Entry
,您覆盖了
hashCode
类中的
Entry
。上面剪的应该是

。。。
int key=line.hashCode();
...
否则,您将使用class
String
hashCode
方法(或
getname
返回的任何内容)

然而,对于Java哈希代码来说,这不是一个好的实现,因为它不是为您的用例设计的。我会重新考虑你在这里用来分类的方法。

你写道

。。。
int key=line.getNames().hashCode();
...
当我正确地看到它时,
变量的类型是
Entry
,您覆盖了
hashCode
类中的
Entry
。上面剪的应该是

。。。
int key=line.hashCode();
...
否则,您将使用class
String
hashCode
方法(或
getname
返回的任何内容)


然而,对于Java哈希代码来说,这不是一个好的实现,因为它不是为您的用例设计的。我将重新考虑您在这里用于排序的方法。

您试图使用哈希函数来实现按姓氏(或至少姓氏的第一个字符)排序的表-这不是哈希的目的。一个更简单的解决方案是将姓氏、姓名首字母和电话号码封装到一个类中,该类实现了
Comparable
,并使用一个自动排序的数据结构,例如
TreeSet
,或使用
Collections::sort
对数据进行编程排序。无需提出违反哈希代码约定的自定义解决方案。您正在尝试使用哈希函数来实现按姓氏(或至少姓氏的第一个字符)排序的表-这不是哈希的目的。一个更简单的解决方案是将姓氏、姓名首字母和电话号码封装到一个类中,该类实现了
Comparable
,并使用一个自动排序的数据结构,例如
TreeSet
,或使用
Collections::sort
对数据进行编程排序。因此,无需提出违反哈希代码契约的自定义解决方案。