踏ん切りをつけたいブログ

独学でwebサービス作成したり、サリー売ってみたり、迷走中。

文頭に番号を振る(Java)

特定の文字列の後に、0から順番に番号を振る必要があったので、Javaで作りました。

hogehoge=fugafuga を
hogehoge=1a.fugafugaに変換します。

aは識別文字で数字とは別に指定できるようにしています。
冒頭に#や改行がある行はスキップします。

public static void main(String[] args) {

		if (args.length != 3){
			System.out.println("引数が足りません。1.読み込み元2.書き込み先3.識別子");
		}

		String FP = args[0];
		String FM = args[1];
		String mark = args[2];

引数を3つとります。引数渡すのを忘れてエラーで終了する事が多々あるので、
忘れた時にメッセージ出すようにしました。
一般的にはどう処理するのが正解なのでしょうか...

public static HashMap addNumbersToEachStrings(HashMap linemap, String mark) {
		// String trimedLine = line.trim();
		HashMap<Integer, String> changedlinemap = new HashMap<Integer, String>();

		for (int i = 0; i < linemap.size(); i++) {

			String eachLine = (String) linemap.get(i);
			String[] splitedEachline = eachLine.split("[\\s]*=[\\s]*", 2);
			if(splitedEachline.length == 2){
			String changedLine = splitedEachline[0] + "=" + mark + i + "." + splitedEachline[1];
			changedlinemap.put(i, changedLine);
			}else{
				changedlinemap.put(i, eachLine);
				System.out.println("処理しないで書き込まれた行"+ i);
			}
		}
		return changedlinemap;

メインの処理部分です。
linemapにBufferedReaderでファイルから読み込んだ変換前の文字列が入っています。
markは識別子です。

String[] splitedEachline = eachLine.split("[\\s]*=[\\s]*", 2);

この部分で=の前後で分を分解しています。
分解後はjava|String[] splitedEachlineに格納します。
一番最初の=だけで分解したかったので、splitの第二引数に2を渡します。

この段階では#や改行も処理されていますが、

String changedLine = splitedEachline[0] + "=" + mark + i + "." + splitedEachline[1];

で番号と識別子を付け加えて分解した行を作り直すときに、分解できなかった列になると、
index out of bounds exceptionで終了してしまいます。

そのため、事前に

String[] splitedEachline

に2つ値を格納できているか

if(splitedEachline.length == 2)
||< 
で確認して、入っていない異常終了元の行は、何も手を加えずにスキップします。

その後、書き出し用のファイルを作成して、書き出して終了です。

改行や#など処理できない行をどう回避するのか悩み、
String.startsWith冒頭の文字を指定してスキップしたりしていましたが、