工作上遇到一个要求两个不同list对象合并后并排序
1、问题描述
从数据库中查询两张表的当天数据,并对这两张表的数据,进行合并,然后根据时间排序。
2、思路
从数据库中查询到的数据放到各自list中,先遍历两个list,存到主list中,然后根据各自list的对象属性time属性排序。
3、需要技术
Java API针对集合类型排序提供了两种支持:
Java.util.Collections.sort(java.util.List)
Java.util.Collections.sort(java.util.List, java.util.Comparator)
第一个方法要求所排序的元素类必须实现java.lang.Comparable接口。
第二个方法要求实现一个java.util.Comparator接口。
这两个接口不但可以用于集合元素排序,还可以用于数组排序。如果数组或集合元素是String类型,则可以利用JavaAPIComparator对象String.CASE_INSENSITIVE_ORDER为容器元素排序。
代码演示
public classBill {privateInteger id ;privateString card ;privateString money ;privateTimestamp conDateTime ;publicInteger getId() {returnid;
}public voidsetId(Integer id) {this.id =id;
}publicString getCard() {returncard;
}public voidsetCard(String card) {this.card =card;
}publicString getMoney() {returnmoney;
}public voidsetMoney(String money) {this.money =money;
}publicTimestamp getConDateTime() {returnconDateTime;
}public voidsetConDateTime(Timestamp conDateTime) {this.conDateTime =conDateTime;
}
}
编写对象 Bill.java
public classRecharge {privateInteger id ;privateString amount ;privateString money ;privateString conType ;privateTimestamp rechargeTime ;publicInteger getId() {returnid;
}public voidsetId(Integer id) {this.id =id;
}publicString getAmount() {returnamount;
}public voidsetAmount(String amount) {this.amount =amount;
}publicString getMoney() {returnmoney;
}public voidsetMoney(String money) {this.money =money;
}publicString getConType() {returnconType;
}public voidsetConType(String conType) {this.conType =conType;
}publicTimestamp getRechargeTime() {returnrechargeTime;
}public voidsetRechargeTime(Timestamp rechargeTime) {this.rechargeTime =rechargeTime;
}
}
编写对象 Recharge.java
public class ComparatorTime implementsComparator {/***
* TODO 以对象Time判断两个list对象排序(可选).
*@seejava.util.Comparator#compare(java.lang.Object, java.lang.Object)*/@Overridepublic intcompare(Object arg0, Object arg1) {
Bill cb ;
Recharge rd ;
Bill cb1 ;
Recharge rd1 ;if(arg0 instanceofBill){
cb=(Bill)arg0;if(arg1 instanceofRecharge){
rd=(Recharge)arg1;returncb.getConDateTime().compareTo(rd.getRechargeTime());
}else{
cb1=(Bill)arg1;returncb.getConDateTime().compareTo(cb1.getConDateTime());
}
}else{
rd1=(Recharge)arg0;if(arg1 instanceofRecharge){
rd=(Recharge)arg1;returnrd1.getRechargeTime().compareTo(rd.getRechargeTime());
}else{
cb=(Bill)arg1;returnrd1.getRechargeTime().compareTo(cb.getConDateTime());
}
}
}
}
通过实现Comparable接口实现个性化排序测试。
升序排列:Collection.sort(list)
降序排列:Collections.sort(list, Collections.reverseOrder());
反转排序:Collections.reverse(list);
public classTest {public static voidmain(String[] args) {
Bill cb1= newBill() ;
cb1.setId(1);
cb1.setCard("1111");
cb1.setMoney("1111");
cb1.setConDateTime(Timestamp.valueOf("2016-09-28 16:00:00.0"));
Bill cb2= newBill() ;
cb2.setId(2);
cb2.setCard("2222");
cb2.setMoney("2222");
cb2.setConDateTime(Timestamp.valueOf("2016-09-28 10:00:00.0"));
Recharge rd1= newRecharge() ;
rd1.setId(3);
rd1.setAmount("3333");
rd1.setConType("3333");
rd1.setMoney("3333");
rd1.setRechargeTime(Timestamp.valueOf("2016-09-28 8:00:00.0"));
Recharge rd2= newRecharge() ;
rd2.setId(4);
rd2.setAmount("4444");
rd2.setConType("4444");
rd2.setMoney("4444");
rd2.setRechargeTime(Timestamp.valueOf("2016-09-28 12:00:00.0"));
List listBill = new ArrayList() ;
listBill.add(cb1) ;
listBill.add(cb2) ;
List listRecharge = new ArrayList() ;
listRecharge.add(rd1) ;
listRecharge.add(rd2) ;
List list= newArrayList() ;
Iterator it1=listRecharge.iterator() ;while(it1.hasNext()) {
list.add(it1.next()) ;
}
Iterator it2=listBill.iterator() ;while(it2.hasNext()) {
list.add(it2.next()) ;
}//排序前
System.out.println("排序前:"+newGson().toJson(list));//排序后
ComparatorTime comparator=newComparatorTime();
Collections.sort(list, comparator);
System.out.println("正序:"+newGson().toJson(list));//排序后逆序
Collections.reverse(list);
System.out.println("逆序:"+newGson().toJson(list));
}
}
测试类Test
效果图