taaa0905
@taaa0905

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

禁則処理が実現しない

解決したいこと

ここに解決したい内容を記載してください。
"このプログラムは、句読点を行頭禁則処理するサンプル。¥n"+ "最後の行です。",8);
上記文章の禁足処理に取り組んでおります。処理後、下記のような1行8文字で「。」「¥n」「。¥n」が文章に含まれている場合、含まれている箇所で改行。句読点が行頭に来た場合は前の行に含めるといった処理を行いたいです。
このプログラムは、
句読点を行頭禁則
処理するサンプル。
最後の行です

発生している問題・エラー

出ているエラーメッセージを入力
    at java.base/java.util.AbstractList.remove(AbstractList.java:167)
    at StringsJaHyphenationSplitter.splitFixedLengthJaHyphenationWithLineBreakCodeAndPeriod(StringsJaHyphenationSplitter.java:49)
    at StringsJaHyphenationSplitter.main(StringsJaHyphenationSplitter.java:7)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

ソースコードを入力
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class StringsJaHyphenationSplitter {
  public static void main(String[] args) {
    List<String> lines = splitFixedLengthJaHyphenationWithLineBreakCodeAndPeriod(
        "このプログラムは、句読点を行頭禁則処理するサンプル。¥n"
            + "最後の行です。",
        8);
    for (String line : lines) {
      System.out.println(line);
    }
  }

  private static List<String> splitFixedLengthJaHyphenationWithLineBreakCodeAndPeriod(String str, int lineLength) {
    List<String> linesList = new ArrayList<String>();
    int strLength = str.length();

    for (int i = 0; i < strLength; i++) {
      if (str.contains("。¥n")) {
        linesList = Arrays.asList(str.split("(?<=。¥n)"));
      }
      if (str.contains("[。、]")) {
        linesList = Arrays.asList(str.split("(?<=[。、])"));
      }
      if (str.contains("¥n")) {
        linesList = Arrays
            .asList(str.split("¥n|(?<=\\G.{" + lineLength + "})"));
      }
    }
    int lineCount = linesList.size();
    for (int i = 0; i < lineCount; i++) {
      String initialCharacter = String.valueOf(linesList.get(i).charAt(0));
      if (initialCharacter.matches("[、。]")) {
        for (int j = i; j < lineCount - 1; j++) {
          String previousLine = linesList.get(j - 1);
          String currentLine = linesList.get(j);
          String currentLineInitial = String.valueOf(currentLine.charAt(0));
          String newPreviousLine = previousLine + currentLineInitial;
          String newCurrentLine = currentLine.substring(1, currentLine.length());
          int springLength = linesList.get(j).length();
          if (springLength > 0) {
            linesList.set(j - 1, newPreviousLine);
            linesList.set(j, newCurrentLine);
          }
        }
        if (linesList.get(i).length() == 0) {
          linesList.remove(i);
        }
      }
    }
    return linesList;
  }
}

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。
正規表現、必要の無いList配列の削除を試みましたがどちらも上手くいかず、行き詰ってしまいました。助言を頂けると幸いです。

0

1Answer

イテレーションループ中に対象の配列の要素を追加・削除・変更することはConcurrent Modificationと呼び,多くの場合で禁忌とされる行為です.
ArrayListを直接ループする場合に同様の操作を行うと例外を発生します.

配列に対し何らかの写像を得たい場合は,元配列を直接操作するのではなく,結果用の配列を作成したうえでそちらを操作するようにします.

1Like

Comments

  1. @taaa0905

    Questioner

    ありがとうございます。
  2. スローされる例外の種類が書かれていないので正確な回答はできませんが、

    Arrays.asListメソッド

    によって生成されたListはイミュータブル(不変)なので、addやsetはできません。
    可変なリストを使いましょう。

Your answer might help someone💌