#java #string
#java #строка
Вопрос:
У меня есть проблема и вопрос с использованием строк.
Проблема, с которой я столкнулся, заключается в чтении строки в текстовом файле. Допустим, в моем txt-файле у меня есть слово «привет», и я просто пытаюсь проверить, что пользователь вводит одно и то же.
В файле .txt просто есть слово «привет».
Вот код.
String fileWord;
File filename = fileOpen.getSelectedFile(); // Open the .txt file
FileReader filereader = new FileReader(filename);
BufferedReader inputFile = new BufferedReader(filereader);
String input = JOptionPane.showInputDialog("Say hello");
fileWord = inputFile.readLine();
if (input == fileWord)
System.out.println("They match!");
Однако это не работает. Я ввел System.out.println как для input, так и для fileWord, и они кажутся одинаковыми, но это не так, поскольку оператор if() не работает.
Еще один вопрос, который у меня есть: если в файле .txt у меня есть одна строка «привет, до свидания», как мне читать по одному слову в строке за раз? Например, если пользователь вводит «привет», то он находит его в текстовом файле и возвращает «до свидания».
РЕДАКТИРОВАТЬ Я продвинулся дальше в своей программе и столкнулся с другой проблемой. Всякий раз, когда пользователь вводит слово, если он не находит слово в файле, предполагается, что оно записывается в новый файл. В моей программе я использую цикл для поиска по файлу, чтобы найти слово. Когда я ввожу слово, которого нет в файле, я получаю ошибку исключения, и программа закрывается. Я не могу понять, где и как я выясняю, что слова нет в файле.
while (!input.equals(fileWord))
{
fileWord = inputFile.readLine();
String[] wordSplit = englishWord.split("\s ", 2);
fileWord = wordSplit[0];
fileWord2 = wordSplit[1];
}
System.out.println("The opposite of " fileWord " is " fileWord2);
Этот пример найдет «привет» в текстовом файле и выведет «до свидания», и это работает нормально. Но, если я введу какое-то случайное слово в качестве входных данных, и оно его не найдет, что мне делать, чтобы двигаться дальше и продолжить добавлять его в новый файл? Я думаю, я могу понять, как записывать в файл…Я просто не могу правильно выйти из цикла без исключения.
Ответ №1:
Используется equals()
для сравнения строк, а не ==
:
if (input.equals(fileWord))
Что касается вашего второго вопроса, то самый простой способ — прочитать всю строку целиком, а затем split()
ее. Это даст вам двухэлементный массив строк. Вы можете использовать первый элемент для сравнения и вернуть второй элемент, если есть совпадение:
String[] words = line.split("\s ", 2);
// words[0] will contain "hello"
// words[1] will contain "goodbye"
Комментарии:
1. Идеальный. Большое вам спасибо. Не могли бы вы дать краткое объяснение «\ s «?
2. @user1015523: Это регулярное выражение, которое соответствует одному или нескольким последовательным пробелам. Здесь слишком мало места для объяснения регулярных выражений. Я предлагаю вам взглянуть на это руководство: download.oracle.com/javase/tutorial/essential/regex
3. Есть ли способ перейти от метода цикла к поиску равного слова, если слово не существует? Я отредактировал свой первоначальный пост для дальнейшего объяснения.
4. На самом деле, я думаю, что у меня получилось, используя try и catch в цикле while с (исключением e) в качестве улова. Это хороший способ сделать это?
Ответ №2:
Вам нужно использовать equals() , а не == для сравнения двух строк на равенство. Использование == с объектами возвращает true, только если обе стороны ссылаются на один и тот же объект (две строки с одинаковым содержимым по-прежнему являются двумя разными строковыми объектами).
Ответ №3:
Строки сравниваются с .equals()
помощью метода:
input.equals(fileWord)
Для строк с несколькими словами используйте split()
метод, чтобы разделить их на массив, а затем сравнить input
с каждым элементом массива. (И выйти из цикла, если есть совпадение).
Ответ №4:
Не используйте == со строками. Используйте String.equals.
== сравнивает идентификатор объектов, а не содержимое.