我有以下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>();
现在无论如何我可以根据日期将l1
和l2
的对象放在finalList
中
e.g。 finalList应如下所示
A(1, 2014-12-12);
B(1, 2014-12-13);
A(2, 2014-12-14);
B(2, 2014-12-15);
我该怎么做?
答案 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);
}
});