hashCode冲突将两个不同的单词放在同一位置

时间:2014-02-13 22:10:57

标签: java eclipse hashtable

我应该用哈希表实现一个接口。问题是我得到了错误的输出,这是由于碰撞(根据我的理解)。我没有完全独自编写这段代码,我一直在寻求帮助。在我课程的早期,我不是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;
    }
}

4 个答案:

答案 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的有效索引从0this.tableSize - 1,在您的情况下为24

Hashcode冲突预期并且是正常现象。具有相同的哈希码并不意味着元素是相等的;它只是意味着它们散列到相同的值。您必须查看内容以确定。

这样的结构中的目标通常是创建一个散列函数,减少碰撞的概率。您目前有一个非常简单的散列函数,它只是散列码的模数和表的大小,因此您有1 / tableSize碰撞的机会(如果我错了,有人请在这里纠正我)。