#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
, потому что это бесполезно, и, кроме того, вы используете его неправильно. AHashSetlt;Stringgt;
был бы хорошим выбором для вашего «словаря». Загрузите свои слова в набор и используйте егоcontains()
метод для поиска слов.