Я пытаюсь создать программу, которая считает, сколько слов в текстовом файле. Моя цель состоит в том, чтобы как только текст был виден в textArea, он мог подсчитать все слова в нем.
Мой код для открытия файлов .txt таков:
Action Open = new AbstractAction("Open File") {
@Override
public void actionPerformed(ActionEvent e) {
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
openFile(fc.getSelectedFile().getAbsolutePath());
}
}
};
public void openFile(String fileName) {
FileReader fr = null;
try {
fr = new FileReader(fileName);
textArea.read(fr, null);
fr.close();
setTitle(fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
Я видел, как люди выводили отдельные слова в консоль, например = 11, но я хочу заменить текст в textArea на "fileName has x number of words"
Используйте DocumentFilter




Сначала получить значение из текстового поля
String text=textArea.getText ();
Теперь используйте функцию длины, чтобы получить длину строки.
int countWord=text.length();
Теперь распечатайте в консоли
System.out.println ("No of Words : "+countWord);
Это будет количество символов
Вдруг сообразил, что, возможно, я воспринял вопрос буквально
Возможно, вы имели в виду нечто большее, похожее на ...
String text = // Text from the file...
int letterCount = text.length();
int wordCount = text.split("\\s").length;
String result = "[insert file name here] has " + letterCount + " characters and " + wordCount + " words";
// A JTextArea you created eailer
textArea.setText(result);
but what I want is to replace the text in the textArea with "fileName has x number of words"
Я не совсем уверен, что вы имеете в виду, но ...
Лучшим местом для начала (для этого требования) будет DocumentFilter.
Это позволит вам отфильтровать текст, примененный к Document / JTextArea, и заменить его любым текстом, который вы хотите.
Может что-то вроде этого ...
public class WordCounterDocumentFilter extends DocumentFilter {
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
int letterCount = text.length();
int wordCount = text.split("\\s").length;
String result = "[insert file name here] has " + letterCount + " characters and " + wordCount + " words";
super.replace(fb, 0, fb.getDocument().getLength(), result, attrs);
}
}
Который затем мог бы использовать что-то вроде этого ...
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
JTextArea ta = new JTextArea(10, 20);
add(new JScrollPane(ta));
ta.setEditable(false);
((AbstractDocument)ta.getDocument()).setDocumentFilter(new WordCounterDocumentFilter());
ta.setText("This is a bunch of text");
}
}
public class WordCounterDocumentFilter extends DocumentFilter {
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
int letterCount = text.length();
int wordCount = text.split("\\s").length;
String result = "[insert file name here] has " + letterCount + " characters and " + wordCount + " words";
super.replace(fb, 0, fb.getDocument().getLength(), result, attrs);
}
}
}
Что выведет что-то вроде этого ...
// Решил сделать вот так, но // при отсутствии строк читает как одну строку private void countWords() {String text=textArea.getText ();int countWord=text.split("\\s").length;textArea.setText("Number of Words : "+countWord);
Последний вопрос, когда я пытаюсь подсчитать и пустое поле, он все равно считает, как я могу это исправить. Я имею в виду, что попробуйте посчитать его без текста, и он выдает 1.
Сначала обрежьте String от начальных / конечных пробелов (String#trim), затем проверьте длину полученного String, если это 0, то в нем нет слов
Если вы используете \ s + вместо \ s в качестве регулярного выражения, оно не будет считать новые строки, что даст вам более точный результат.
@Tymek Нужны диски должны, но поскольку сам вопрос был несколько расплывчатым, таков и ответ;)
Добро пожаловать в Stack Overflow! Пожалуйста, возьмите тур, осмотритесь и прочитайте центр помощи, в частности Как мне задать хороший вопрос? и Какие темы я могу задать здесь?. Из этой второй ссылки: «Вопросы с просьбой о помощи в домашнем задании должны включать краткое изложение работы, которую вы проделали до сих пор для решения проблемы, и описание трудностей, с которыми вы ее решаете».