我应该用哈希表实现一个接口。问题是我得到了错误的输出,这是由于碰撞(根据我的理解)。我没有完全独自编写这段代码,我一直在寻求帮助。在我课程的早期,我不是Java大师,所以这对我来说都很难,所以请耐心等待。
到目前为止,这是我的代码:
runStringDictionary.java
import java.io.BufferedReader;
import java.io.FileReader;
public class runStringDictionary {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
if (args.length == 0 || args.length > 1) {
System.out.println("Syntax to run the program: java runStringDictionary <inputFile>");
}
if (args.length == 1) {
try {
Dictionary myDictionary = new Dictionary(); //Initialize a Dictionary to store input words
BufferedReader br = new BufferedReader(new FileReader(args[0])); //Read the text file input
String line;
while ((line = br.readLine()) != null) {//Read each line
String[] strArray = line.split(" "); //Separate each word in the line and store in another Array
for (int i = 0; i < strArray.length; i++) { //Loop over the Array
if (myDictionary.contains(strArray[i])) { //Check if word exists in the dictionary
myDictionary.remove(strArray[i]); //if it does remove it
} else {
myDictionary.add(strArray[i]); //if it doesn't then add it
}
}
}//while loop ends
//print the contents of myDictionary
for (int i = 0; i < 25; i++) {
if (myDictionary.table[i] != null) {
System.out.println(myDictionary.table[i]);
}
}
} catch (Exception e) {
System.out.println("Error found : " + e);
}
}
}
}
StringDictionary.java
public interface StringDictionary {
public boolean add(String s);
public boolean remove(String s);
public boolean contains(String s);
}
Dictionary.java
public class Dictionary implements StringDictionary {
private int tableSize = 25;
Object[] table;
// constructor
Dictionary() {
this.table = new Object[this.tableSize];
}
@Override
public boolean add(String s) {
// TODO Auto-generated method stub
int hashCode = s.hashCode() % this.tableSize;
if (!this.contains(s)) {
this.table[hashCode] = s;
}
return false;
}
@Override
public boolean remove(String s) {
// TODO Auto-generated method stub
int hashCode = s.hashCode() % this.tableSize;
if (this.contains(s)) {
this.table[hashCode] = null;
return true;
}
return false;
}
@Override
public boolean contains(String s) {
// TODO Auto-generated method stub
int hashCode = s.hashCode() % this.tableSize;
if (table[hashCode] != null) {
if (table[hashCode].equals(s))
return true;
}
return false;
}
}
答案 0 :(得分:1)
哈希代码冲突在哈希表中是正常的,你必须有一个完美的哈希函数才能避免它们。有multiple strategies,您可以实现以处理冲突,但基本上,您要么在列表中移动项目,将它们放在不同的存储桶中,要么允许每个存储桶存储多个值,例如通过ArrayList中。
决定从表中检索哪个值,如果多个值共享相同的哈希码,则会在查找时间方面带来额外的成本,因此良好的哈希函数将尽可能地减少冲突的数量。
答案 1 :(得分:1)
Hashcode冲突是预期的和正常的;哈希码用于缩小潜在匹配池的范围,然后必须检查那些潜在匹配的规范相等。
答案 2 :(得分:1)
此int hashCode = s.hashCode() % this.tableSize;
表示您的词典只能包含25个元素。对于任何字符串,您将获得0到24之间的hashCode。
您需要保留一系列列表。每个列表都包含具有相同hasCode的字符串。
答案 3 :(得分:0)
int hashCode = s.hashCode() % this.tableSize; will
你一定会在这里发生碰撞。 table
的有效索引从0
到this.tableSize - 1
,在您的情况下为24
。
Hashcode冲突预期并且是正常现象。具有相同的哈希码并不意味着元素是相等的;它只是意味着它们散列到相同的值。您必须查看内容以确定。
这样的结构中的目标通常是创建一个散列函数,减少碰撞的概率。您目前有一个非常简单的散列函数,它只是散列码的模数和表的大小,因此您有1 / tableSize
碰撞的机会(如果我错了,有人请在这里纠正我)。