###前提・実現したいこと
CSVを読んで中身を変換、ソートして標準出力をしたい。
CSVの中身は
1
A100,yyyyMMdd,名前
S234,yyyyMMdd,名前
・
・
・
となっていて、頭の数字が1なら降順、0なら昇順にする。
データ欠損、存在しない日、アンパサンドのデータなどのエラーは表示しない。
ソートはIDの1文字目でAEDGSRの順で並べたい。それ以外はエラーになる。
###発生している問題・エラーメッセージ
任意順のソートができない
###該当のソースコード
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import dateconversion.Mysort;
public class Reader {
public static void main(String args[]) {
// 1行を格納する箱作成
List<Mysort> tmpList = new ArrayList<Mysort>();
File file = new File(args[0]); // CSVデータファイル
if (file.isFile()) { try (BufferedReader br = Files.newBufferedReader(Paths.get(args[0]), Charset.forName("MS932"))) { // ファイルオープン String line; String retention = null; int sub1; String sub2 = null, sub3 = null, addsub = null; while ((line = br.readLine()) != null) { Mysort M = new Mysort(); if (line.length() == 1) { //始めの1行用 retention = line; } else { try { String[] cols = line.split(","); if (cols.length == 3) { M.setSub1(cols[0]); M.setSub2(cols[1]); M.setSub3(cols[2]); sub1 = M.getChange1(); sub2 = M.getChange2(); sub3 = M.getChange3(); if (sub1 != 9 && sub2 != null && sub3 != null && cols[0].length() == 4) { sub3 = cols[2]; //文字列結合 addsub = cols[0] + "," + sub2 + "," + sub3; // 文字列を格納
// M.add(sub1);
} } } catch (NumberFormatException e) { } } } if (retention.equals("1")) { // 降順になる } else if (retention.equals("0")) { // 昇順になる } Collections.sort(tmpList, new Comparator<Mysort>() public int compare(Mysort mysort1, Mysort mysort2) { int temp = 0; if (mysort1.getChange1() > mysort2.getChange1()) temp = -1; if (mysort1.getChange1() < mysort2.getChange1()) temp = 1; if (temp == 0) { temp = mysort1.getChange2().compareTo(mysort2.getChange2()); return temp; } for (int i = 0; i < tmpList.size(); i++) { System.out.println(tmpList.get(i)); } } catch (IOException e) { e.printStackTrace(); } } else { System.out.println("ファイル指定が間違っています"); System.exit(-1); }
}
_________________________
package dateconversion;
public class Mysort {
private String sub1; private String sub2; private String sub3; public String getSub1() { return sub1; } public void setSub1(String sub1) { this.sub1 = sub1; } public String getSub2() { return sub2; } public void setSub2(String sub2) { this.sub2 = sub2; } public String getSub3() { return sub3; } public void setSub3(String sub3) { this.sub3 = sub3; } @Override public String toString() { return sub1 + ", " + sub2 + ", " + sub3; } public int getChange1() { int change1; switch (sub1.substring(0, 1)) { case "A": change1 = 1; break; case "E": change1 = 2; break; case "D": change1 = 3; break; case "G": change1 = 4; break; case "S": change1 = 5; break; case "R": change1 = 6; break; default: change1 = 9; } return change1; } public String getChange2() { return Converter.conversion(sub2); } public String getChange3() { return Nullchecker.nullchecker(sub3); }
}
__________________________
package dateconversion;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Mfnumconverter {
public static String mfnumconvertion(String mfnum) { String sub2 = null; boolean bo = Nullchecker.isNotEmpty(mfnum); if (bo == true) { String num1 = mfnum.substring(0, 1); String num2 = mfnum; boolean num3 = Mfnumconverter.isNumberStr(mfnum.substring(1)); if (num1.equals("A") || num1.equals("E") || num1.equals("D") || num1.equals("G") || num1.equals("S") || num1.equals("R")) { if (num2.length() == 4 && num3 == true) { sub2 = num2; } } return sub2; } return sub2; } public static boolean isNumberStr(String num3) { Pattern p = Pattern.compile("^[0-9]+$"); Matcher m = p.matcher(num3); return m.find(); }
}
###試したこと
IDの1文字目を切り取って数字を割り振った
###補足情報(言語/FW/ツール等のバージョンなど)
win10 64bit
Java 8
eclipse
回答5件
あなたの回答
tips
プレビュー