2011-08-25 4 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()); 
    }    
}); 

Что я делаю неправильно?

Вот что я вижу в выходе Foo Fighters Альбомы по дате выпуска:

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 или использовать SimpleDateFormat#parse() для преобразования String в Date внутри метода compare(), а затем вызвать Date#compareTo() вместо этого, то упорядочение будет работать, как ожидалось.

Я бы заменил его на java.util.Date. Всегда используйте правильный тип для значения, которое он представляет.

+0

да, вы правы. Я решил это вчера, и теперь он правильно сравнивает. Спасибо. – dropsOfJupiter

+1

Добро пожаловать. Теперь еще нужно исправить 'mm', чтобы быть' MM', прежде чем задавать другой вопрос, когда вы задаетесь вопросом, что месяцы не упорядочены должным образом. Я бы предпочел использовать реальное поле «Дата». Он заканчивается менее неуклюжим кодом преобразования его взад и вперед от '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'. Прочтите ['SimpleDateFormat' javadoc] (http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html) для обзора всех шаблонов. – BalusC

Смежные вопросы