不会比较从PrintWriter读入的2个相同的字符串

时间:2014-11-19 22:57:52

标签: java hashtable string-comparison

我正在编写一个程序,该程序通过PrinterWriter获取由一个程序创建的文档,然后将该文档中的行散列到新程序中的数组中。哈希是通过使用字母的ASCII代码并将它们相加来完成的。我能够为每一行获取正确的哈希并将其保存在哈希表中。顺便说一下,它是一个被散列的国家列表。我的问题是它似乎无法将用户输入的国家/地区进行比较,即使它是复制和粘贴,也可以将其显示在哈希表中以显示它们。它不仅应该在哈希表中显示国家,而且还应该在哈希表中显示所有国家。因此,如果一个人应该去现场23但是去了26点,显示23-26以显示聚类。我已经厌倦了一切以使它工作,但似乎没有任何工作,请帮忙。我已经包含了一些代码:

import java.io.PrintWriter;
import java.io.File;
import java.util.*;
import java.text.*;

public class Hashing
{
    String[] line = new String[238];
    String[] HashTable = new String[300];

    public Hash() {
        for (int i = 0; i< HashTable.length; i++) {
            HashTable[i]=null;
        }
    }

    public void readIn()throws Exception {
        Scanner ln = new Scanner(new File(System.getProperty("user.home"),     "user.home.CountryUnSortedFormat.txt"));
        int i = 0;
        while (ln.hasNextLine()) {
            line[i] = ln.nextLine();
            i++;
        }
    }

    public int toASCII(String input) {
        int total = 0;
        char character;
        String str = input.replaceAll(",","").trim();
        if (str.length() > 50) {
            for (int i = 0; i<50; i++) {
                int ascii = str.charAt(i);
                if (ascii > 32) {
                    total = total + ascii;
                }
            }
        } else if (str.length()<50) {
            for (int i = 0; i<str.length(); i++) {
                int ascii = str.charAt(i);
                if (ascii > 32) {
                    total = total + ascii;
                }
            }
        }
        return total % 300;
    }

    public void hashIt(String input, int where){
        int counter = where;  
        if (where==299 && HashTable[where]!=null){
            counter = 0;
        }
        while (HashTable[counter]!=null){
            counter++;
        }
        System.out.println("Country = " + input + " HashValue = " + where + " actual HashSpot = " + counter);
        HashTable[counter]=input;
    }

public boolean showCountries(String paramCountry, int where){
int location = where;
int length = paramCountry.length();
while (!(HashTable[location].substring(0,length).contains(paramCountry))){
System.out.println("Input = " + paramCountry + " and HashTableCOunty = " +     HashTable[location].substring(0,length));
System.out.println("The Hash Table Index is " + location + " " + HashTable[location]);
     if (!(HashTable[location].substring(0,length).contains(paramCountry))){
     location++;
     }
     else if (HashTable[location].substring(0,length).contains(paramCountry)){
     System.out.println("The Hash Table Index is " + location + " " + HashTable[location]);
     System.out.println("Eguals");
     return true;
     }
     if (location==300||HashTable[location]==null){
     System.out.println("End");
     return false;
     }
     }
 return false;
 } 


    public void displayHashTable() {
        for (int i = 0; i<HashTable.length; i++) {
            System.out.println("i = " + i + " " + HashTable[i]);
        }
    }

    public static void main(String[]args)throws Exception {
        Scanner kb = new Scanner(System.in);

        Hash H = new Hash();
        H.readIn();
        for (int i = 0; i< 238; i++) {
            int where = H.toASCII(H.line[i]);
            H.hashIt(H.line[i], where);
        }
        H.displayHashTable();

        String UserChoice;
        System.out.println("Enter the Name of the Country you wish to locate in the Hash Table or Enter -1 to quit: ");
        UserChoice = kb.nextLine();
        while (!(UserChoice.equalsIgnoreCase("-1"))) {
            int index = H.toASCII(UserChoice);
            boolean error = H.showCountries(UserChoice, index);
            while (error == false) {
                System.out.println("The country you searched for is not in the hash table.  Try again.");
                UserChoice = kb.nextLine();
                index = H.toASCII(UserChoice);
                error = H.showCountries(UserChoice, index);
            }
            System.out.println("Enter the Name of the Country you wish to locate in the Hash Table or Enter -1 to quit: ");
            UserChoice = kb.nextLine();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

让我们看一下showCountries方法:

public boolean showCountries(String paramCountry, int where) {
    //....
    return false;
}

我删除了不包含return语句的每一行。如您所见,无论是否找到搜索到的元素,您始终都会返回false

因此这个循环:

while (error == false) {
    //...
}

就像一个无限循环。

更改showCountries方法中的代码以返回true,找到该国家/地区。

并考虑将变量名称error更改为其他内容。 error == false听起来像“一切都好”,但这不是这里的情况。

如果我正确理解您的代码,您可以更改此内容:

else if (paramCountry.equals(HashTable[location].substring(0,length))) {
    System.out.println("The Hash Table Index is " + location + " " + HashTable[location]);
    break;
}

为:

else if (paramCountry.equals(HashTable[location].substring(0,length))) {
    System.out.println("The Hash Table Index is " + location + " " + HashTable[location]);
    return true;
}

修改

另一个容易出错的地方就在这里:

int length = paramCountry.length()-1;

while (!(paramCountry.equals(HashTable[location].substring(0,length)))) {
//...

由于-1的使用,您正在切断最后一个字符。 一个小例子:

paramCountry = "Eng";
HashTable[0] = "England";
int length = paramCountry.length()-1; // 2 (paramCountry.length() is 3)

这是上述值的结果:

HashTable[0].substring(0,length)) // "En"
paramCountry.equals(HashTable[0].substring(0, length)) // "Eng".equals("En") -> false

因此,您可以删除-1或删除substring并使用contains代替。

编辑2:

因此,在您使用contains代替substring进行编辑后,您只剩下一个错误(我最后看到的一个错误):

while (!(HashTable[location].substring(0, length).contains(paramCountry))) {
    // ...
}
return false;

在您调用方法showCountries之前,您通过调用H.toASCII(UserChoice);来计算可能的位置。该位置被赋予方法location,它在上面的while循环中使用。将跳过此循环,因为已找到搜索国家/地区。不好的是:在这种情况下,您将返回false

现在我建议将此返回更改为return true;,因为只有找到搜索到的国家/地区(并且跳过了while循环)才会显示此行。如果找不到该国家/地区,则会在此false正文中返回if (location==300||HashTable[location]==null)