質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2381閲覧

配列 ソート java java.util.ConcurrentModificationException

KINGFROG

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/02/22 05:41

テキストデータを読み込み、市外局番が4桁のものを抽出し、苗字のアルファベット順に並び替えてから、テキストに出力するという処理ですが、Exception in thread "main" java.util.ConcurrentModificationExceptionが出てしまいます。
read2の箇所でエラーがでているのは、理解できたのですが、エラーの意味が理解できません。
テキストデータは(1 Hiyomi Tanaka Oosaka 0120-3456-7890 3000)が何行かあるものです。
どなたかご教示頂ければと思います。

package account;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test04 {

private static final String FILE_PATH = "C:\\Users\\itcuser\\Downloads\\account.txt"; public static void main(String[] args) { List<String> myoujiList = new ArrayList<String>(); // ファイルの読み込み read(myoujiList); read2(myoujiList); read3(myoujiList); } public static void read(List<String> myoujiList) { BufferedReader br = null; try { br = new BufferedReader(new FileReader(FILE_PATH)); String line = null; // ファイルの読み込み while ((line = br.readLine()) != null) { String[] array = line.split("\\s"); if (array.length == 6) { myoujiList.add(array[2] + " " + line); } } // 昇順でソートする Collections.sort(myoujiList); for (String s : myoujiList){ System.out.println(s); } // 以下エラー処理 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { // if (br != null) { br.close(); // } } catch (IOException e) { e.printStackTrace(); } } } public static void read2(List<String> myoujiList){ for (String s : myoujiList) { // 条件から対象データを抽出する Pattern p = Pattern.compile("(.+)\\s(.+)\\s(.+)\\s(.+)\\s(.+)\\s(.+)\\s(.+)");// 任意の一文字、直前の文字の0回以上の繰り返しのもの Matcher m = p.matcher(s); if (m.matches()) { System.out.println(s); // 文字列にくっついている空白を削除し、グループを足し合わせて表示する myoujiList.add(m.group(2).trim() + " " + m.group(3).trim() + " " + m.group(4).trim() + " " + m.group(5).trim() + " " + m.group(6).trim() + " " + m.group(7).trim()); System.out.println((m.group(2).trim() + " " + m.group(3).trim() + " " + m.group(4).trim() + " " + m.group(5).trim() + " " + m.group(6).trim() + " " + m.group(7).trim())); } } }

public static void read3(List<String> myoujiList){

for (String s : myoujiList) { // 条件から対象データを抽出する Pattern p = Pattern.compile("\\s0\\d\\d\\d-"); Matcher m = p.matcher(s); if (m.find()) { System.out.println(s); // 対象データをファイルに書き出す try { FileWriter fw = new FileWriter("C:\\Users\\itcuser\\Downloads\\4digit.txt", true); BufferedWriter bw = new BufferedWriter(fw); bw.write(s); bw.newLine(); bw.close(); System.out.println("書き込みました。"); } catch (IOException ex) { ex.printStackTrace(); } } else { System.out.println("対象ではありません。"); } }

}}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

意味だけ説明すると、JavaのArrayListは、イテレータを使ったfor文の最中に「要素が増える」「要素が減る」といった処理を行うとConcurrentModificationExceptionが発生します。作業の途中で増やしたり減らしたりするんじゃねぇ!という例外です。

投稿2017/02/22 05:46

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/02/22 06:08

補足すると、拡張for文でイテレータが暗黙的に使用されています。
KINGFROG

2017/02/22 06:23

となると、trim()などの処理は拡張for文の後にすれば、ConcurrentModificationExceptionが発生しないということでしょうか?
masaya_ohashi

2017/02/22 06:28

そういうことになります。作業用のリストを別に作っておいて、そっちに追加しておいてあとでaddAllとかで結合すればよいでしょう。
KINGFROG

2017/02/22 06:45

ありがとうございます。 理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問