我在尝试对自定义对象的 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);
最佳答案
为什么不简单地使用 Date#compareTo()用于比较,因为 java.util.Date
实现了 Comparable
接口(interface)。
在排序后,该方法不必返回 List
的实例,因为底层 List
对象将通过调用排序进行修改。基本上,该方法是通过将引用值作为参数传递来调用的。因此,当进行修改时,更改会反射(reflect)在引用值指向的基础对象上。使用这种方法,代码只需将 List
传递到方法中,然后继续在后续代码中使用相同的引用,该引用将指向已排序的基础 List
.
要考虑的另一项是修改方法以接受 List
类型的参数,而不是 ArrayList
,因为 List
是一个接口(interface),因此更抽象。这将允许代码切换传递给方法的 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我创建了一个完整的工作示例,展示了此方法的实际应用。
关于java - 排序 ArrayList<CustomObject>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24769988/