プロが教えるわが家の防犯対策術!

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回読んでも肝心なとこはよくわからん始末でして、
何卒、後輩を助けようと腕まくりしたら困ったおじさんを助けてください。

質問者からの補足コメント

  • まさにここの理解が足りないんだと思います。
    ググったらString::lengthなんて記述があったので
    「コレクションの要素の型かインターフェースとメソッド入れれば良いのか。」と思ったんで、とりあえず試してみました。
    違和感はあったので通らなくても驚きはしませんでした。

    どちらかというと、List<List<String>>の簡便なsort方法を教えてほしいという質問になります。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/06/29 08:56
  • うれしい

    自己解決しました。
    今朝ラムダ式を勉強して下記の記述でソートできるようになりました。
     ※第3カラムは昇順のままですが。
    tipsとして報告します。

    Collections.sort(tempFileData,Comparator.comparing((List<String> e) -> e.get(1)).thenComparing((List<String> e) -> e.get(2)));

      補足日時:2016/06/29 10:46

A 回答 (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() ) // 降順
);
    • good
    • 0

そもそも


List::get(1)
なんて書き方をどこで習ったんでしょうか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!