【问题标题】:Sorting ArrayList<CustomObject>排序 ArrayList<CustomObject>
【发布时间】:2014-07-15 23:47:25
【问题描述】:

我在尝试对自定义对象的 ArrayList 进行排序时遇到问题。事实上,在排序之后,我的 ArrayList 没有任何变化。我的方法有问题吗?

这是我的艺术家自定义对象属性:

public class Artist {

String mNickname;
String mName;
String mDescription;
String mScene;
String mDay;
String mTime;
String mImageURL;   
Date mDate;

// getters and setters below like getDate() for mDate...

这是用于排序的方法:

static public ArrayList<Artist> sortArrayByDate(ArrayList<Artist> list) {       

    Collections.sort(list, new Comparator<Artist>() {
        @Override
        public int compare(Artist lhs, Artist rhs) {
            if (lhs.getDate().getTime() < rhs.getDate().getTime())
                return -1;
            else if (lhs.getDate().getTime() == rhs.getDate().getTime())
                return 0;
            else
                return 1;
        }
    });

    return list;
}

我知道这个话题已经在 StackOverflow 上讨论过很多次了,但是我找不到为什么我不能让它正常工作。感谢您的理解

编辑:日期 (java.util.date) 是使用 SimpleDateFormatter 创建的

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.CANADA_FRENCH);

【问题讨论】:

  • 您能告诉我您使用的是哪种日期格式吗?
  • 我使用以下方法构造我的日期:SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.CANADA_FRENCH);
  • 你能把它贴在你的代码里吗?所以我也可以发布我的答案:)
  • 谢谢。所以你只使用 Date 类并用这种格式解析它?
  • 我很难想出一个格式?

标签: java sorting collections arraylist


【解决方案1】:

为什么不简单地使用Date#compareTo() 进行比较,因为java.util.Date 实现了Comparable 接口。

该方法不必在排序后返回List 的实例,因为底层的List 对象将通过调用排序进行修改。基本上,通过将引用值作为参数传递来调用该方法。因此,当进行修改时,更改会反映在引用值指向的基础对象上。使用这种方法,代码只需将List 传递到方法中,然后继续在后续代码中使用相同的引用,这将指向已排序的底层List

要考虑的另一项是修改方法以接受List 类型的参数,而不是ArrayList,因为List 是一个接口,因此更抽象。这将允许代码切换传递给方法的List 的实现。这很重要,因为ArrayList 不保证列表中项目的顺序得到维护。为了保证List 中的项目顺序保持使用LinkedList

static public void sortArrayByDate(List<Artist> list) {       

    Collections.sort(list, new Comparator<Artist>() {
        @Override
        public int compare(Artist lhs, Artist rhs) {
            return lhs.getDate().compareTo(rhs.getDate());
        }
    });

}

这是我创建的GitHub Gist,它展示了这个方法的实际效果,并带有一个完整的工作示例。

【讨论】:

  • @KickButtowski 我假设java.util.Date
  • 只是为了我的学习目标,当他使用这种格式时,你的回答将如何帮助他的问题? SimpleDateFormat 格式 = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.CANADA_FRENCH);
  • 一旦Date 被构造为Date 并且可以使用compareTo 方法进行比较,他如何构造Date 就无关紧要了。
  • 我知道,但他想要 getTime 比较而不是日期?
  • @KickButtowski getTime 返回自 Unix 纪元以来毫秒的日期表示,这就是 Date.compareTo 在幕后所做的。您可以通过检查 Java 源代码来进行验证。将其挂接到 Eclipse 中非常有用,因此您可以看到 java 或 javax 包中的任何内容是如何实现的
猜你喜欢
  • 1970-01-01
  • 2018-08-15
  • 2014-03-24
  • 2014-11-20
  • 1970-01-01
  • 2013-07-30
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多