概要

JTextAreaなどのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。

サンプルコード

int count = 0;
StringTokenizer st = new StringTokenizer(textArea.getText(), "\n");
while (st.hasMoreTokens()) {
  if (st.nextToken().codePointAt(0) == '#') {
    count++;
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JTextArea#getText()ですべてのテキストを取得してからStringTokenizerを使って行毎に分解しています。returnDelimsフラグがfalseなのでトークンが空行になることはありません。


  • String#split(...)を使用する場合
    • 空行あり
for (String line: textArea.getText().split("\\n")) {
  if (!line.isEmpty() && line.codePointAt(0) == '#') {
    count++;
  }
}
  • LineNumberReaderを使用する場合
    • 空行あり
try (LineNumberReader lnr = new LineNumberReader(new StringReader(txa.getText()))) {
  String line = null;
  while ((line = lnr.readLine()) != null) {
    if (!line.isEmpty() && line.codePointAt(0) == '#') {
      count++;
    }
  }
} catch (IOException ioe) {
  ioe.printStackTrace();
}
  • Element#getElementCount()を使用する場合
    • 空行なし(Elementには少なくとも長さ1の改行が存在する)
Document doc = textArea.getDocument();
Element root = doc.getDefaultRootElement();
try {
  for (int i = 0; i < root.getElementCount(); i++) {
    Element elm = root.getElement(i);
    String line = doc.getText(
        elm.getStartOffset(), elm.getEndOffset() - elm.getStartOffset());
    if (line.codePointAt(0) == '#') {
      count++;
    }
  }
} catch (BadLocationException ble) {
  ble.printStackTrace();
}

参考リンク

コメント