Java Android Collections.sort-无法正常工作

Java Android Collections.sort-无法正常工作,java,android,sorting,collections,Java,Android,Sorting,Collections,我尝试使用以下代码根据日期按desc顺序对对象的ArrayList进行排序: List<GalleryBean> gallery_beans = this.galleryAdapter.getGalleryImageList(); Collections.sort(gallery_beans, new Comparator<GalleryBean>() { public int compare(GalleryBean bean1, Gall

我尝试使用以下代码根据日期按desc顺序对对象的ArrayList进行排序:

    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));
    }
我假设getMediaDate的结果是一个长值。当比较这些值时,您正在向下转换为int,这将从long中截断位并产生意外的结果。试试这样的

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

对于下降,我们在减法上反转交换bean

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

您还需要处理其中一个为null的实例。例如,如果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;
}

我看不出哪些日期顺序不对。另外,您确定要在创建新日期对象时将媒体日期乘以1000,因为年份是46591是的,1000表示我从服务器收到的毫秒数,因此本地文件匹配的时间为I*1000。如果这样做:System.out.printlnew DateSystem.currentTimeMillis*1000;我得到的年份是46869,所以我想时间已经是毫秒了。您上面的日志显示年份为46591。您是对的。我删除了*1000,但排序仍处于关闭状态…我尝试了此操作,但排序仍不正确。不知道为什么,但下面是示例输出:11-24 21:59:21.278:I/迭代器-->16949:gallery_bean name-->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/迭代器-->16949:gallery_bean name-->IMG__20140601_171056.jpg gallery_bean long date-->14057057gallery_bean日期-->2014-06-01 17:10:57 GMT-04:00哦,您想要降序。交换>和<符号,或者交换前后值。我会做后一个-如果你想降序,交换前后值。下面的答案有效,所以我打赌这一个也会。我将在上午试一试。谢谢嗨,我也试过了,但效果一样。请参阅下面的日志片段:11-24 22:15:15.022:I/迭代器-->22819:gallery_bean name-->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:15.023:I/迭代器-->22819:gallery_bean name-->IMG_6556.jpg gallery_bean long date-->1390421255000 gallery_bean long date-->2014-01-22 16:07:35 GMT-04:00我会再次交换bean1和bean2。如果输出没有变化,则排序不会发生,或者列表在排序和打印之间正在更新。getGalleryImageList是返回一个新列表还是保留一个实例?看起来像是我首先从降序开始写的。我将编辑我的答案。
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;
}