2017-04-03 1 views
0

にリストを印刷する方法を見つけ出すことはできませんは基本的に私は名前とたstartDateを持つオブジェクトの配列リストを持っており、彼らは同様の初期の順序にしている。この正しい順序

ビル・1990年1月2日

フランク・1990年2月2日

ジョン1990年9月8日

ビル1990年4月4日

フランク・1990年5月1日

私は宣言最初の名前の順にそれらを印刷しようとしている、その後、例えば、日付、によって、最終的に印刷を印刷する必要があります:

フランク・1990年1月1日

フランク・1990年5月1日

フランク・1990年10月20日

ビル・1990年1月2日

ビル・1990年4月4日

ジョン1990年9月8日

+0

* "私は、ファーストネームと宣言された順にプリントしようとしています。" * - これまでに何を試しましたか? – MadProgrammer

+0

あなたには2つの基本的な問題があります。両方とも以前に解決されています。最初は、どのように日付を表​​す 'String'を並べ替えるのですか?複数のプロパティに基づいてオブジェクトをソートするにはどうすればいいですか? – MadProgrammer

+0

私はあなたの問題に2つの異なる解決策を追加しました。正確に欲しかった。たぶんあなたはこれを明確にすることができます。 – JDC

答えて

1

あなたがオブジェクトクラスと仮定すると、このようになります:

あなたは以下の方法を使用してオブジェクトを印刷でき
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

0

次の2つのステップでそれを行う必要があります。

Collections.sort(myList, new Comparator<MyObject>() { 
     public int compare(MyObject o1, MyObject o2) { 
      return o1.getName().compareTo(o2.getName()); 
     } 
    }); 

と店舗:のようなカスタムコンパレータを使用して、名前で

まず順テンポラリリストの出力

データで並べ替える第2の使用温度リスト

あなたのリストは必要に応じて並べ替えられます。

+0

これはアルファベット順に注文しませんか?アルファベット順ではなく最初に宣言された名前のオブジェクトをすべて印刷する方法を理解できません –

関連する問題