
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ランキング
-
string→CStringの型変換について
-
strtokでの空文字への置き換え
-
java DAO 日付指定フォーマット...
-
オブジェクトの中のプロパティ...
-
動的配列が存在(要素が有る)か...
-
C言語のポインターに関する警告
-
ORA-01858: 数値を指定する箇所...
-
JSPでの計算結果表示
-
System.err. printlnとSystem.o...
-
C#で、あるクラスのメンバーす...
-
ループ処理の際、最後だけ","を...
-
IF関数でEmpty値を設定する方法。
-
JSPやサーブレットでSystem.out...
-
javaで質問です。 文字列2023/2...
-
<forEach> 内で供給された "ite...
-
ページング
-
jspでの二次元配列
-
日付や時刻の"01"を" 1"に変換...
-
javascriptで文字列のsjis利用...
-
この警告はどうすれば?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Java8以降】csvファイルの複...
-
C# ListBoxのアイテムをユーザ...
-
マルチスレッドで同時にFTPアッ...
-
strcmp関数などでの複数の文字...
-
特定の文字列が一致する行から...
-
デバックができない C#
-
「(string)$i」のような変則な文
-
C#でIPアドレスの取得について
-
★C#のXML読み込みについて
-
p->next(ポインタ)的なことを...
-
jap実行時のTomcatのエラーに困...
-
string→CStringの型変換について
-
C#についてです
-
プログラミングC++に関して質...
-
ArrayListを改良したい
-
コンストラクタの変数を別のコ...
-
「指定されたキャストは有効で...
-
C# List型のIndesOf メゾットに...
-
strtokでの空文字への置き換え
-
C#での関数テーブルの作り方
おすすめ情報
まさにここの理解が足りないんだと思います。
ググったら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)));