Java 按日期对对象顺序的排序列表
我有如下bean定义:Java 按日期对对象顺序的排序列表,java,collections,Java,Collections,我有如下bean定义: Class A{ int id Date date; } Class B{ int id Date date; } 我有如下数组列表 List<A> l1 = new ArrayList<A>() l1.add(new A(1, 2014-12-12)); l1.add(new A(2, 2014-12-14)); List<B> l2 = new ArrayList<B>()
Class A{
int id
Date date;
}
Class B{
int id
Date date;
}
我有如下数组列表
List<A> l1 = new ArrayList<A>()
l1.add(new A(1, 2014-12-12));
l1.add(new A(2, 2014-12-14));
List<B> l2 = new ArrayList<B>()
l2.add(new B(1, 2014-12-13));
l2.add(new B(2, 2014-12-15));
A(1, 2014-12-12);
B(1, 2014-12-13);
A(2, 2014-12-14);
B(2, 2014-12-15);
我怎样才能做到这一点呢?假设我有一门课
class MyClass
{
Date date;
}
通过实现可比较的接口,您可以轻松地对“MyClass”实例列表进行排序:
class MyClass implements Comparable<MyClass>
{
Date date;
@Override
public int compareTo(MyClass o)
{
if (o.date.getTime() > this.date.getTime())
return -1;
else
return 1;
}
}
class A implements Dated {
int id;
Date date;
@Override
public Date getDate() {
return date;
}
}
class B implements Dated {
int id;
Date date;
@Override
public Date getDate() {
return date;
}
}
更多信息请点击这里
编辑:
请注意,您可以实现多个不同类型的可比较接口,以便将您的类与其他类进行比较。Supose我有这个bean:
class Item implements Comparable<Item> {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
int id;
Date date;
public Item(int id, String date) throws ParseException {
this.id = id;
this.date = formatter.parse(date);
}
@Override
public int compareTo(Item o) {
return this.date.compareTo(o.date);
}
}
类项实现可比较的{
SimpleDataFormat格式化程序=新的SimpleDataFormat(“yyyy-MM-dd”);
int-id;
日期;
公共项(int-id,String-date)引发异常{
this.id=id;
this.date=formatter.parse(日期);
}
@凌驾
公共整数比较(o项){
将此.date.compareTo返回(o.date);
}
}
我实现了java.lang.Comparable接口。
之后,我只需在finalList中添加所有项,并使用java.util.Collections类的排序方法对列表进行排序,如下所示:
List<Item> l1 = new ArrayList<Item>();
l1.add(new Item(1, "2014-12-12"));
l1.add(new Item(2, "2014-12-14"));
List<Item> l2 = new ArrayList<Item>();
l2.add(new Item(1, "2014-12-13"));
l2.add(new Item(2, "2014-12-15"));
List<Item> finalList = new ArrayList<Item>();
finalList.addAll(l1);
finalList.addAll(l2);
Collections.sort(finalList);
List l1=new ArrayList();
l1.增加(新项目(1,“2014-12-12”);
l1.增加(新项目(2,“2014-12-14”);
列表l2=新的ArrayList();
l2.增加(新项目(1,“2014-12-13”);
l2.增加(新项目(2,“2014-12-15”);
List finalList=new ArrayList();
最终添加所有(l1);
finalList.addAll(l2);
Collections.sort(finalList);
您可以选择不在bean中实现可满足接口,并使用另一种方法:
Collections.sort(finalList, new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.date.compareTo(o2.date);
}
});
Collections.sort(finalList,newcomparator(){
@凌驾
公共整数比较(项目o1、项目o2){
返回o1.日期比较(o2.日期);
}
});
我假设您有两个不同的类,并且都有日期对象。与其保留对象列表,我建议您创建一个基本界面,例如:
interface Dated {
Date getDate();
}
使您的两个类实现此接口:
class MyClass implements Comparable<MyClass>
{
Date date;
@Override
public int compareTo(MyClass o)
{
if (o.date.getTime() > this.date.getTime())
return -1;
else
return 1;
}
}
class A implements Dated {
int id;
Date date;
@Override
public Date getDate() {
return date;
}
}
class B implements Dated {
int id;
Date date;
@Override
public Date getDate() {
return date;
}
}
创建一个比较器,如:
class DatedComparator implements Comparator<Dated> {
@Override
public int compare(Dated o1, Dated o2) {
return o1.getDate().compareTo(o2.getDate());
}
}
我假设您不能选择使列表中的不同类型兼容。但如果排序确实是您唯一的问题,您可以使用自适应比较器进行排序:
class DateOrder implements Comparator<Object> {
@Override
public int compare(Objecto1, Objecto2) {
return toDate(o1).compareTo(toDate(o2));
}
private Date toDate(Object x) {
if (x instanceof A) {
return ((A)x).date;
}
return ((B)x).date;
}
}
类DateOrder实现了Comparator{
@凌驾
公共整数比较(Objecto1、Objecto2){
返回toDate(o1)。与toDate(o2)进行比较;
}
私有日期toDate(对象x){
if(A的x个实例){
申报表((A)x).日期;
}
申报表((B)x).日期;
}
}
但是,在一个集合中使用几种不同的类型通常不是一个好主意。因此,也许最好使用实例适配器(即包装器),为处理该类型的逻辑提供一个独特的接口。)在大多数情况下,这种方法从长远来看更有价值,因为不必为了获取数据的另一部分而反复转换。但我对您的问题了解不够,无法给出明确的建议。“2014-12-12”是一个字符串(现在w/o“”只是一个错误),您应该使用SimpleDataFormat从该字符串创建一个新日期这是一个sudo代码。假设其日期类型为object,则可以使类实现Comparable()接口,这样就可以重写排序组件并在实例列表上使用Collections.sort()。两个日期可以用它们的时间戳来比较。你能写一些示例代码吗。这样我就更容易理解并使用SimpleDataFormat创建日期对象,然后使用比较器。
Collections.sort(finalList, new DatedComparator());
class DateOrder implements Comparator<Object> {
@Override
public int compare(Objecto1, Objecto2) {
return toDate(o1).compareTo(toDate(o2));
}
private Date toDate(Object x) {
if (x instanceof A) {
return ((A)x).date;
}
return ((B)x).date;
}
}