
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でIPアドレスの取得について
-
特定の文字列が一致する行から...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
javaで質問です。 文字列2023/2...
-
一定のスペースを空けて端を揃...
-
ループ処理の際、最後だけ","を...
-
EXCEL VBA で、0から?1から?
-
論理演算子”||”またはの入力方法
-
eclipseに記述したjavaファイル...
-
動的配列が存在(要素が有る)か...
-
JSPやサーブレットでSystem.out...
-
テキストボックスに入力された...
-
変数を動的に利用するには?
-
配列について
-
ダブルクォーテーションのrepla...
-
IF関数でEmpty値を設定する方法。
-
オブジェクトの中のプロパティ...
-
JSPでImportエラーになります
-
jsp/Servletの動的に増えるフォ...
マンスリーランキングこのカテゴリの人気マンスリー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)));