2011-08-25 24 views
1

アルバムをリリース日順にソートしようとしています。何らかの理由で私はどこにもいません:日付フィールドでコレクションを並べ替える方法は?

//sort by release date 
Collections.sort(this._items, new Comparator<Album>() { 
    public int compare(Album t1, Album t2) { 
     int dateCmp = t2.getStartDate().compareTo(t1.getStartDate()); 
     Log.i("==Albums==", "dateComp: " + dateCmp); 
     return t1.getStartDate().compareTo(t2.getStartDate()); 
    }    
}); 

私は間違っていますか?

name: There Is Nothing Left To Lose | release date: 11/2/1999 
name: Greatest Hits | release date: 11/3/2009 
name: Skin And Bones | release date: 11/7/2006 
name: Foo Fighters | release date: 12/10/2003 
name: DOA | release date: 12/13/2005 
name: Rope | release date: 3/1/2011 
name: The Colour And The Shape | release date: 3/30/2010 
+0

によって

//ソートは、それはあなたがアルバムのクラスのために私たちのコードを与えることは可能ですか? – momo

+0

なぜ比較結果の_inverse_をログに記録していますか?それはちょうど誰かを混乱させる責任があります(あなたがむしろ明示的にそれをログで呼び出すのでなければ...) –

答えて

6

それはあなたのstartDateフィールドがタイプjava.lang.Stringであることを次のようになります。ここでは

は、私はリリース日でフー・ファイターズアルバムの出力で見るものです。少なくとも、出力の順序はそれを確認します。 String#compareTo()は、ビューアの目で表現する値ではなく、辞書順にStringの値を並べます。

あなたがjava.util.Dateこと、またはcompare()メソッド内DateStringを変換するSimpleDateFormat#parse()を使用して、代わりにDate#compareTo()を呼び出すための間違った種類を変更する場合は、予想通り、その後、順序は動作します。

私はjava.util.Dateでそれを置き換えると思います。それが表す値には常に正しいタイプを使用してください。

+0

はい、あなたは正しいです。私はこれを昨日解決しましたが、今は正しく比較しています。ありがとうございました。 – dropsOfJupiter

+1

ようこそ。 MMが 'MM'になるように修正する前に、月が適切に注文されていないのを不思議に思う別の質問をする前に。私はむしろ本当の 'Date'フィールドを代わりに使用したいと思います。それは、すべての比較/計算で 'String'から前後に変換する不器用なコードで終わります。コンソール、スクリーン、ファイルなどでalの後に表示したい場合は、 'SimpleDateFormat#format()'を使ってください。さらに、ほとんどのUIライブラリ/フレームワークは、すぐに使えるコンポーネントを提供しています。 – BalusC

0

ここは完全なコードです。問題は、開始日がstring型であったためです。リリース日

Collections.sort(this._items, new Comparator<Album>() {  
         public int compare(Album t1, Album t2) { 

          int dateCmp = 0; 

          try { 

           SimpleDateFormat formatter; 
           Date date1; 
           Date date2; 
           formatter = new SimpleDateFormat("dd/mm/yyyy"); 

           date1 = (Date)formatter.parse(t1.getStartDate()); 
           date2 = (Date)formatter.parse(t2.getStartDate()); 

           dateCmp = (date2).compareTo(date1); 

           } 
           catch (Exception e) 
           { 
           //Log.i("==Albums==", "album special sort - error"); 
           } 

          //Log.i("==Albums==", "dateComp: " + dateCmp); 

          return dateCmp; 

         }    
        }); 
+0

'mm'は、月を表し、分を表します。代わりに 'MM'を使いたいとします。すべてのパターンの概要については、['SimpleDateFormat' javadoc](http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html)を参照してください。 – BalusC

関連する問題