2014-11-25 4 views
0

Я пытаюсь использовать следующий код для сортировки ArrayList объекта по дате в порядке по убыванию:Android Collections.sort - не работает должным образом

List<GalleryBean> gallery_beans = this.galleryAdapter.getGalleryImageList(); 
    Collections.sort(gallery_beans, new Comparator<GalleryBean>() { 
     public int compare(GalleryBean bean1, GalleryBean bean2) { 
      final int BEFORE = -1; 
      final int EQUAL = 0; 
      final int AFTER = 1; 

      /* 
      if(bean1.getMediaDate() > bean2.getMediaDate()){ 
       Log.i("Collections.sort---->", "move bean1 name, long, date ---> ," + 
         bean1.getMediaName() + ", " + bean1.getMediaDate() + ", " + new Date(bean1.getMediaDate()) + 
         ", AFTER bean2 name, long, date ---> "+ bean2.getMediaName() + ", " + bean2.getMediaDate() + ", " + new Date(bean2.getMediaDate())); 
       return AFTER; 
      } else if(bean1.getMediaDate() < bean2.getMediaDate()){ 
       Log.i("Collections.sort---->", "move bean1 name, long, date ---> ," + 
         bean1.getMediaName() + ", " + bean1.getMediaDate() + ", " + new Date(bean1.getMediaDate()) + 
         ", BEFORE bean2 name, long, date ---> "+ bean2.getMediaName() + ", " + bean2.getMediaDate() + ", " + new Date(bean2.getMediaDate())); 
       return BEFORE; 
      } else { 
       return EQUAL; 
      } 
      */ 
      return (int) (bean1.getMediaDate() - bean2.getMediaDate()); 
     } 
    }); 

    for (Iterator<GalleryBean> it = gallery_beans.iterator(); it.hasNext(); i++) { 
     GalleryBean gallery_bean = it.next(); 
     Log.i("ITERATOR---->", "gallery_bean name ---> " + gallery_bean.getMediaName() + " gallery_bean long date ---> " + gallery_bean.getMediaDate() + " gallery_bean date ---> " + new Date(gallery_bean.getMediaDate()*1000)); 
    } 

Из моего исследования комментируемого из кода должен но, похоже, ничего не делает. Оставшаяся строка делает некоторую сортировку, но она неверна. Ниже приведен фрагмент вывода журнала из кода возврата (int) *. Я пытаюсь сортировать по дате в формате long unix. Буду признателен за любую оказанную помощь.

С уважением, JT_Dylan

11-24 21:03:47.407: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_140338.jpg gallery_bean long date ---> 1408125820000 gallery_bean date ---> Sat Sep 24 08:06:40 EST 46591 
11-24 21:03:47.407: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_140408.jpg gallery_bean long date ---> 1408125850000 gallery_bean date ---> Sat Sep 24 16:26:40 EST 46591 
11-24 21:03:47.407: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_152133.jpg gallery_bean long date ---> 1408130495000 gallery_bean date ---> Thu Nov 17 11:43:20 EDT 46591 
11-24 21:03:47.407: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_152134.jpg gallery_bean long date ---> 1408130496000 gallery_bean date ---> Thu Nov 17 12:00:00 EDT 46591 
11-24 21:03:47.407: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_152137.jpg gallery_bean long date ---> 1408130498000 gallery_bean date ---> Thu Nov 17 12:33:20 EDT 46591 
11-24 21:03:47.409: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_152140.jpg gallery_bean long date ---> 1408130501000 gallery_bean date ---> Thu Nov 17 13:23:20 EDT 46591 
11-24 21:03:47.409: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_152231.jpg gallery_bean long date ---> 1408130553000 gallery_bean date ---> Fri Nov 18 03:50:00 EDT 46591 
11-24 21:03:47.409: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_153950.jpg gallery_bean long date ---> 1408131592000 gallery_bean date ---> Wed Nov 30 04:26:40 EDT 46591 
11-24 21:03:47.411: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_154004.jpg gallery_bean long date ---> 1408131605000 gallery_bean date ---> Wed Nov 30 08:03:20 EDT 46591 
11-24 21:03:47.411: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_154011.jpg gallery_bean long date ---> 1408131613000 gallery_bean date ---> Wed Nov 30 10:16:40 EDT 46591 
11-24 21:03:47.411: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_154011_1.jpg gallery_bean long date ---> 1408131613000 gallery_bean date ---> Wed Nov 30 10:16:40 EDT 46591 
11-24 21:03:47.414: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_162439.jpg gallery_bean long date ---> 1408134281000 gallery_bean date ---> Sat Dec 31 07:23:20 EDT 46591 
11-24 21:03:47.414: I/ITERATOR---->(3949): gallery_bean name ---> IMG_20140815_162446.jpg gallery_bean long date ---> 1408134288000 gallery_bean date ---> Sat Dec 31 09:20:00 EDT 46591 
+0

Я не могу видеть, какие даты находятся в неправильном порядке. Кроме того, вы уверены, что хотите увеличить дату носителя на 1000 при создании нового объекта Date, поскольку год составляет 46591 – slipperyseal

+0

Да, 1000 - миллисекунды, которые я получаю с сервера, поэтому я * 1000 для локальных файлов, чтобы они соответствовали , –

+0

Если я это сделаю: System.out.println (новая дата (System.currentTimeMillis() * 1000)); Я получаю год 46869, поэтому я думаю, что время уже в миллисекундах. Ваш журнал выше показывает год как 46591. – slipperyseal

ответ

0

Я предполагаю, что результат getMediaDate() является значением long. При сравнении значений вы отбрасываете до int, который усекает биты из длинного и создает неожиданные результаты. Попробуйте что-то вроде этого ...

public int compare(GalleryBean bean1, GalleryBean bean2) { 
    long value = bean2.getMediaDate() - bean1.getMediaDate(); 
    return value == 0 ? 0 : value > 0 ? 1 : -1; 
} 

Независимо от того, насколько велика разница в качестве долгосрочной стоимости, мы возвращаем int из -1, 0 или 1.

для нисходящих мы инвертировать своп бобы вокруг на вычитании ...

long value = bean1.getMediaDate() - bean2.getMediaDate(); 
+0

Привет, я тоже пробовал это, но те же результаты. См. Фрагмент отчета ниже: '11-24 22: 15: 15.022: I/ITERATOR ----> (22819): gallery_bean имя ---> IMG_20141117_134050.jpg gallery_bean long date ---> 1390420638000 gallery_bean date - -> 2014-01-22 15:57:18 GMT-04: 00 11-24 22: 15: 15.023: I/ITERATOR ----> (22819): gallery_bean имя ---> IMG_6556.JPG gallery_bean long дата ---> 1390421255000 gallery_bean date ---> 2014-01-22 16:07:35 GMT-04: 00 ' –

+0

Я бы поменял bean1 и bean2 снова вокруг. если никаких изменений в выходе нет, сортировка не происходит или список обновляется между сортировкой и печатью. getGalleryImageList() возвращает новый список или удерживает один экземпляр? – slipperyseal

+0

это сработало! Благодаря! –

0

Вам также нужно обрабатывать случай, когда один или другой является нулевым. Например, если значение NULL меньше действительного значения, то ваш чек может быть:

public int compare(GalleryBean bean1, GalleryBean bean2) { 
    final int BEFORE = -1; 
    final int EQUAL = 0; 
    final int AFTER = 1; 
    int result = EQUAL; 

    if (bean1 == null){ 
     if (bean2 != null){ 
      result = BEFORE; 
     } 
    } else { 
     if (bean2 == null){ 
      result = AFTER; 
     } else { 
      if(bean1.getMediaDate() > bean2.getMediaDate()){ 
       result = AFTER; 
      } else if(bean1.getMediaDate() < bean2.getMediaDate()){ 
       result = BEFORE; 
      } 
     } 
    } 
    return result; 
} 
+0

Я пробовал это, но он по-прежнему не сортируется правильно. Не знаю, почему, но здесь есть выборка: '11-24 21: 59: 21.278: I/ITERATOR ----> (16949): gallery_bean имя ---> IMG_20140601_171040.jpg gallery_bean long date ---> 1401657042000 gallery_bean date ---> 2014-06-01 17:10:42 GMT-04: 00 11-24 21: 59: 21.279: I/ITERATOR ----> (16949): gallery_bean имя ---> IMG_20140601_171056 .jpg gallery_bean long date ---> 1401657057000 gallery_bean date ---> 2014-06-01 17:10:57 GMT-04: 00' –

+0

Почему это неправильно? 17:10:57 после 17:10:42 – slipperyseal

+0

ой ты хотел по убыванию.поменяйте местами> и <знаки вокруг, или измените значения ПОСЛЕ и ПЕРЕД. – slipperyseal

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