Строковые вопросы

#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.

== сравнивает идентификатор объектов, а не содержимое.