Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按日期对对象顺序的排序列表_Java_Collections - Fatal编程技术网

Java 按日期对对象顺序的排序列表

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>()

我有如下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>()
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;
    }
}