
csvファイルを読み込み、ソートした結果を別ファイルに出力するjavaプログラムを作成中です。
読み込んだ行をBeanに詰めて標準ソートする方法はわかるのですが、
もっと簡単にできないか探していたところJava8から何やらsortが変更になったぽいと聞きつけました。(http://qiita.com/tag1216/items/50ecf6a7bc10218ee …
そこで以下のようなソースを書いてみたのですが、Eclipseのエラーが出てしまいます。
----コード開始(前略)
BufferedReader inTemp = new BufferedReader(new InputStreamReader(new FileInputStream(inTempFile),"Shift_JIS"));
List<List<String>> tempFileData = new ArrayList<List<String>>();
String inputLine = null;
while ((inputLine = inTemp.readLine()) != null) {
List<String> lineArray = new ArrayList<String>();
lineArray = Arrays.asList(inputLine.split(",",-1));
tempFileData.add(lineArray);
}
// 2カラム目でソート※エラー
// でも「The left-hand side of an assignment must be a variable」とか
//「Syntax error on token "get", AssignmentOperator expected after this token」とか言われる。。
tempFileData.sort(comparing(List::get(1)));
// 本当はこんな感じで、2カラム目⇒3カラム目とかしたいのですが。。。
tempFileData.sort(comparing(List::get(1))..thenComparing(List::get(2),reverseOrder()));
----コード終了
何を隠そうcomparatorというのを初めて使ってみたというのもあって、大人しくクラス作れという話ではあります。
ジェネリックスまでは付いていってたと思うのですが、
久しぶりにjavaを書いたら↓こんな?付きのインターフェースで、、こっちがハテナだわと。
comparing(Function<? super T,? extends U> keyExtractor)
3回読んでも肝心なとこはよくわからん始末でして、
何卒、後輩を助けようと腕まくりしたら困ったおじさんを助けてください。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
// List<List<String>> の簡便な sort 方法
tempFileData.sort( (a,b) -> {
_ int n = a.get(1).compareTo(b.get(1)); // 昇順
_ if (n == 0) n = b.get(2).compareTo(a.get(2)); // 降順
_ return n;
} );
// 比較部分を独立させるなら
Comparator<List<String>> c = (a,b) -> {
_ int n = a.get(1).compareTo(b.get(1));
_ if (n == 0) n = b.get(2).compareTo(a.get(2));
_ return n;
};
tempFileData.sort(c);
// 並び替えた順に即実行
tempFileData.parallelStream().sorted( (a,b) -> {
_ int n = a.get(1).compareTo(b.get(1));
_ if (n == 0) n = b.get(2).compareTo(a.get(2));
_ return n;
} ).forEach( System.out::println );
// comparing を使うなら
tempFileData.sort(
_ comparing( (List<String> a) -> a.get(1) ) // 昇順
_ _ .thenComparing( comparing( (List<String> a) -> a.get(2) ).reversed() ) // 降順
);
// List<MyCSVRecord> の comparing なら、綺麗に書ける
tempFileData.sort(
_ comparing( MyCSVRecord::getColumn2 ) // 昇順
_ _ .thenComparing( comparing( MyCSVRecord::getColumn3 ).reversed() ) // 降順
);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Java8以降】csvファイルの複...
-
C#での関数テーブルの作り方
-
特定の文字列が一致する行から...
-
c言語
-
動的配列が存在(要素が有る)か...
-
jsp/Servletの動的に増えるフォ...
-
オブジェクトの中のプロパティ...
-
一定のスペースを空けて端を揃...
-
Java 日付の加算がうまくいき...
-
ORA-01858: 数値を指定する箇所...
-
C言語のポインターに関する警告
-
[Ljava.lang.Stringってなんですか
-
yyyymmddからyyyy/mm/d...
-
ArrayListからBean配列に値をセ...
-
数字のみにしたい
-
ループ処理の際、最後だけ","を...
-
C言語32bitから64bitの移行につ...
-
javascriptで文字列のsjis利用...
-
ArrayListの要素数の上限
-
配列で、値の入っている要素数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# ListBoxのアイテムをユーザ...
-
【Java8以降】csvファイルの複...
-
特定の文字列が一致する行から...
-
C#でIPアドレスの取得について
-
マルチスレッドで同時にFTPアッ...
-
Delphiで改行文字の置換がうま...
-
jap実行時のTomcatのエラーに困...
-
strcmp関数などでの複数の文字...
-
C# JSONについて
-
C#での関数テーブルの作り方
-
string→CStringの型変換について
-
「指定されたキャストは有効で...
-
C#のdelegateについて
-
C#のStreamReaderでのforeach
-
strtokでの空文字への置き換え
-
C++/CLI 関数がインポートでき...
-
GridViewで複数のDropDownList...
-
クラスの変換について
-
java HashMapで数値データを取...
-
決まった拡張子のファイルだけ...
おすすめ情報
まさにここの理解が足りないんだと思います。
ググったらString::lengthなんて記述があったので
「コレクションの要素の型かインターフェースとメソッド入れれば良いのか。」と思ったんで、とりあえず試してみました。
違和感はあったので通らなくても驚きはしませんでした。
どちらかというと、List<List<String>>の簡便なsort方法を教えてほしいという質問になります。
自己解決しました。
今朝ラムダ式を勉強して下記の記述でソートできるようになりました。
※第3カラムは昇順のままですが。
tipsとして報告します。
Collections.sort(tempFileData,Comparator.comparing((List<String> e) -> e.get(1)).thenComparing((List<String> e) -> e.get(2)));