araharu
@araharu

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Java: 日時(LocalDateTime)をsortしたい

はじめに

急ぎのため、具体的にコードやスクショで説明ができないことをお許しください。

環境

デバイス:MacBookPro13
言語:Java
IDE:IntelliJ
歴:Python1年未満、Java2ヶ月、IDEを使い始めたのも最近で慣れていないです。

問題・エラーが起きている部分

現在Javaであるコードを書いていて、それについての質問です。
元々のコードは、4つの項目をフィールドにもつLineクラス(名前は仮)に、繰り返しでcsvファイルの4列を引数として渡してインスタンスを作り、、インスタンスの配列を作ったところで、その4つの項目を1行とした表を作り、プリントして出力するというものでした。
その4つの項目と言うのは1つめが日時(LocalDateTime)、番号、名前、内容、と言った様な型です。

したいこと

今回、インスタンスの1つ目のフィールドである日時によって、降順に並べ替えたいです。
日時の順番の並べかえみたいなものは分かるのですが、インスタンスの配列をフィールドの日時順で並び替える方法が分かりません

自分でしたこと

ネットで調べ、日時を順にならべるsortみたいなものは見つけたのですが、今回のようなインスタンスの並び替えは分からず、コードを書いて試して見たりはしたのですが分かりませんでした。

最後に

記述させていただいたとおり初心者であり、もしかしたら的はずれなことを言っていたり、分かりにくいこともあるかと思います。
逆質問答えますので、よろしくお願い致します。

0

3Answer

質問の文面を見るに以下のようなLineクラスが存在するのだと思います。

public class Line {
	private LocalDateTime datetime;
	private int no;
	private String name;
	private String content;
	
	public Line(LocalDateTime datetime, int no, String name, String content) {
		this.datetime = datetime;
		this.no = no;
		this.name = name;
		this.content = content;
	}
	public LocalDateTime getDatetime() {
		return datetime;
	}
	
	// そのほかのgetterやsetterは省略
}

このLineクラスのListをdatetimeフィールドの値でソートする場合は以下のように書けばよいです。

List<Line> lines = ...;
lines.sort(Comparator.comparing(Line::getDatetime));

質問の文中には「配列」とありますが、この「配列」がList<Line>ではなくLine[]だとすると、ソート処理は以下のようになります。

Line[] lines = ...;
Arrays.sort(lines, Comparator.comparing(Line::getDatetime));

なお、サンプルコードを提示していただくと、回答の精度が高まると思います。

2Like

方針

  1. Collections#sortを利用する
  2. Stream#sortedを利用する

Collections#sortを利用する

  1. ComparableインターフェイスをLineクラスに実装する
  2. 比較用の一時関数を実装する

ComparableインターフェイスをLineクラスに実装する

注意点:sort方法が複数ある場合は利用が難しい

  1. Lineのクラス宣言でComparable<Line>を追加
  2. LineクラスでcompareToをOverride
    1. return -this.日時.compareTo(引数.日時);
      1. -をつけずにCollections.sortCollections.reverseOrder()を渡しても良い
  3. 配列をArrayListに変換する
  4. Collections.sort(list);

比較用の一時クラスを実装する

  1. new Comparator<Line>(){// 実装}
  2. // 実装部分に以下を実装する
    1. compare(Line a, Line b)メソッドの実装
      1. return a.日時.compareTo(b.日時);
  3. 配列をArrayListに変換する
  4. Collections.sort(list, Comparatorインスタンス.reversed());

Stream#sortedを利用する

  1. Stream.ofで配列をStreamにする
  2. sorted(Comparator.comparing(Line::日時取得メソッド).reversed())でソート
  3. toArray(Line[]::new)で配列に戻す

ソート後の処理がわからないのでどちらがおすすめとは言えないですが、個人的にはStreamを使いたいです。

1Like

Comments

  1. @araharu

    Questioner

    申し訳ございません、
    作りかけ云々というより、現在出先でコードを書いているパソコンがない形になりますm(_ _)m

  2. それだとコードサンプルの例示がむずいですね。
    ↓こちらのサイトが参考になると思います。

Your answer might help someone💌