Алгоритм поиска точного значения в хэш — таблице

#java #search #compare #hashtable

#Ява #Поиск #Сравнить #хэш-таблица

Вопрос:

Для проекта класса я пишу программу проверки орфографии, использующую хэш-таблицу для хранения слов, в которой я должен распознавать, когда буква была либо неуместна, либо пропущена. Это очень конкретно указано в инструкциях, поэтому я не могу отклоняться от этого. Тем не менее, я столкнулся с проблемой поиска значений в указанной хэш-таблице. Например, когда я ввожу слово «те», оно говорит, что я правильно написал это слово, потому что оно находит каждый отдельный экземпляр этих двух букв вместе и говорит: «Да, это действительно!»

Мой вопрос: есть ли способ заставить его искать ТОЛЬКО то, что я ввел, и игнорировать другие буквы в значениях?

Мой код для поиска в хэш-таблице выглядит следующим образом

 Scanner userIn = new Scanner(System.in);   System.out.print("n---Enter a word to check the spelling: ");   String s = userIn.nextLine();  String p = s.toUpperCase();    p.trim();  if(hash.containsValue(p))   {   System.out.println("n"   p   " is spelled correctly");  } else {  System.out.println("Apologies. That word is not found");      }  userIn.close();   System.out.println(p);    }  

Как и было запрошено: Вот остальная часть моего кода, которая инициализирует и создает хэш-таблицу и тому подобное

 Hashtablelt; Integer, String gt; hash = new Hashtablelt; Integer, String gt;(); String input; ArrayListlt;Stringgt; toReturn = new ArrayListlt;gt;(); String line; File allTheWords = new File("words.txt");  public void createTable() throws IOException {    Scanner rd = new Scanner(allTheWords);   int i=0;   while (rd.hasNextLine())  {  line = rd.nextLine();  hash.put(i, line.trim());    i  ;  }    rd.close();    if (hash.isEmpty())  {  System.out.println("Sorry. The function did not work");  }     if (hash.size()gt;0)  {    int len = hash.size();  Random random = new Random();  int randomKey = random.nextInt(len);  System.out.println("Success! You created a hashtable!");    String randomWord = new String(hash.get(randomKey));  System.out.println("For example, line "   randomKey   " is "   randomWord);  }         }    public void run()  {    Scanner userIn = new Scanner(System.in);   System.out.print("n---Enter a word to check the spelling: ");   String s = userIn.nextLine();  String p = s.toUpperCase();    p.trim();  if(hash.containsValue(p))   {   System.out.println("n"   p   " is spelled correctly");  } else {  System.out.println("Apologies. That word is not found");      }  userIn.close();   System.out.println(p);    }  

Комментарии:

1. Можете ли вы привести нам полностью рабочий пример (с инициализированной переменной hash )?

2. Что такое «хэш-таблица»?

3. Извините, я не могу воспроизвести проблему. Я попробовал это с файлом, содержащим слова: тест, текст. Если я введу «те», слово не будет найдено.

4. Почему вы ищете по значению? Это совершенно неэффективно, так как это просто повторение всего. Вы даже не используете тот факт, что у вас есть коллекция хэширования. Вместо этого у вас должны быть эти строки в качестве ключей. Я не уверен, почему вы также храните там индексы, но если они вам не нужны, то набор был бы гораздо лучшим вариантом. Кроме того: вы всегда должны использовать хэш-карту вместо хэш-таблицы, нет причин выбирать хэш-таблицу, она просто полностью потокобезопасна, что делает ее более медленной (для потокобезопасной карты есть лучшие варианты)

5. Не используйте a Hashtable , потому что это бесполезно, и, кроме того, вы используете его неправильно. A HashSetlt;Stringgt; был бы хорошим выбором для вашего «словаря». Загрузите свои слова в набор и используйте его contains() метод для поиска слов.