あなたがオブジェクトクラスと仮定すると、このようになります:
あなたは以下の方法を使用してオブジェクトを印刷でき
private static class MyObject {
private final String name;
private final Date date;
private MyObject(String name, Date date) {
this.name = name;
this.date = date;
}
public String getName() {
return name;
}
public Date getDate() {
return date;
}
}
:
@Test
public void printInOrder() {
List<MyObject> list = new ArrayList<>(); // List containing your objects
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 10, 20).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 1, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 2, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("John", Date.from(LocalDate.of(1990, 9, 8).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 4, 4).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 5, 1).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.stream()
.sorted(Comparator.comparing(MyObject::getName)
.thenComparing(Comparator.comparing(MyObject::getDate)))
.map(obj -> obj.getName() + " " + obj.getDate())
.forEach(System.out::println);
}
出力:
ビル・火1月2日00: 00:00 CET 1990
Bill Wed Apr 04 00:00:00 CEST 1990
フランク・金2月2日午後12時00分○○秒CET 1990
フランク火5月1日夜12時〇〇分00秒CEST 1990
フランク・土10月20日午後12時00分○○秒CET 1990
ジョン・土曜9月8日午後12時00分○○秒CEST 1990
これは、あなたのオブジェクトをソートするためのJava 8のストリームとコンパレータのチェーンを使用しています。比較器は、与えられた属性によって比較され、thenComparing
がそれらを連鎖させるために使用されます。
UPDATE:
私はおそらくあなたを誤解している場合わからないように、ここで次のような場合のための第二のバージョンがある:あなたが名前でソートしたい
が、中の名前が元のリストに表示されているので、最初に表示される名前が最初に表示されます。
この場合、後でコンパレータ内で使用できる個別の一時的なリスト(元の順序の一意の名前のみを含む)で名前の順序を覚えておく必要があります。
このリストは、元のリストをセットに変換し(したがって固有の名前のみを持つ)、このセットをリストに変換して戻します(コンパレータ内でindexOf
を使用できるようにする)。
@Test
public void printInOrder() {
List<MyObject> list = new ArrayList<>();
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 10, 20).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 1, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 2, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("John", Date.from(LocalDate.of(1990, 9, 8).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 4, 4).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 5, 1).atStartOfDay(ZoneId.systemDefault()).toInstant())));
List<String> declaredNameOrder = new ArrayList<>(list.stream()
.map(MyObject::getName)
.collect(Collectors.toCollection(LinkedHashSet::new)));
list.stream()
.sorted(Comparator.<MyObject>comparingInt(o -> declaredNameOrder.indexOf(o.getName()))
.thenComparing(Comparator.comparing(MyObject::getDate)))
.map(obj -> obj.getName() + " " + obj.getDate())
.forEach(System.out::println);
}
出力:
フランク・金2月2日夜12時00分00秒CET 1990
フランク火5月1日夜12時00分00秒CEST 1990
フランク・土10月20日夜12時00分00秒CET 1990
ビル・火1月2日午前0時00分○○秒CET 1990
ビル水曜日4月4日午後12時00分〇〇秒CEST 1990
ジョン・土曜9月8日午後12時00分〇〇秒CEST 1990
* "私は、ファーストネームと宣言された順にプリントしようとしています。" * - これまでに何を試しましたか? – MadProgrammer
あなたには2つの基本的な問題があります。両方とも以前に解決されています。最初は、どのように日付を表す 'String'を並べ替えるのですか?複数のプロパティに基づいてオブジェクトをソートするにはどうすればいいですか? – MadProgrammer
私はあなたの問題に2つの異なる解決策を追加しました。正確に欲しかった。たぶんあなたはこれを明確にすることができます。 – JDC