我正在编写一个程序,该程序通过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();
}
}
}
答案 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)
。