按日期排序对象顺序列表

时间:2014-04-12 19:27:06

标签: 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>()
l2.add(new B(1, 2014-12-13)); 
l2.add(new B(2, 2014-12-15)); 

另一个列表如下

List<Object> finalList = new ArrayList<Object>();

现在无论如何我可以根据日期将l1l2的对象放在finalList

e.g。 finalList应如下所示

A(1, 2014-12-12); 
B(1, 2014-12-13);
A(2, 2014-12-14);  
B(2, 2014-12-15);

我该怎么做?

4 个答案:

答案 0 :(得分:1)

我假设你有两个不同的类,都有Date对象。我建议您创建一个基本界面,而不是保留对象列表,例如:

interface Dated {
   Date getDate();
}

让你的两个类实现这个接口:

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

然后你可以保存一个Dated对象列表:

List<Dated> finalList = new ArrayList<Dated>();

可以使用比较器轻松排序:

Collections.sort(finalList, new DatedComparator());

答案 1 :(得分:1)

我认为你不能让你的列表中的不同类型兼容。但是,如果odering真的是你唯一的问题,你可以使用自适应比较器进行排序:

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;
    }
}

然而,在单个集合中具有多种不同类型通常不是一个好主意。所以也许最好使用一个实例适配器(即包装器为这些类型的逻辑提供一个独特的接口。)在大多数情况下,这种方法在长期内更有价值,因为它不需要一次又一次地重复投射。获得另一部分数据。但是我对你的问题知之甚少,无法提出明确的建议。

答案 2 :(得分:0)

假设我有一个像

这样的课程
class MyClass
{
   Date date;
}

您可以通过实现Comparable接口轻松地对“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;
  }
}

这样,如果您有一个MyClass列表,您可以将其排序为

Collection.sort(mylist);

此处有更多信息http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

编辑:

请注意,您可以使用不同的类型实现多个Comparable接口,以便您可以将类与其他类进行比较。

答案 3 :(得分:0)

我有这个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);
    }
}

看到我实现了java.lang.Comparable接口。 之后我只是在finalList中添加所有项目,并使用java.util.Collections类的sort方法对列表进行排序,如下所示:

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

您可以选择不在bean中实现Complarable接口,并使用另一种方法:

Collections.sort(finalList, new Comparator<Item>() {

        @Override
        public int compare(Item o1, Item o2) {
            return o1.date.compareTo(o2.date);
        }
    });