Java集合List按日期升序或降序四種方法

總結Java集合List按日期升序或降序常見的四種方法如下


四種方法快速預覽

Method 1、不管是Date、String、Long類型的日期都可以排序,無需轉換

orders.sort((t1, t2) -> t2.getPayTime().compareTo(t1.getPayTime()));

Method 2、利用stream,需要把字符串日期轉換爲時間戳

orders = orders.stream().sorted((t1,t2) -> 
		 			Long.compare(convertTimeToLong(t2.getPayTime()), 
		 			convertTimeToLong(t1.getPayTime()))).
				 collect(Collectors.toList());

Method 3、利用Comparator接口實現,java8的寫法

Collections.sort(orders, Comparator.comparing(Order::getPayTime, (t1, t2) -> t2.compareTo(t1)));

Method 4、利用Comparator接口實現,java8之前通常這樣寫

Collections.sort(orders,new Comparator<Order>(){
		@Override
		public int compare(Order o1, Order o2) {
			return o2.getPayTime().compareTo(o1.getPayTime());
		}
});

準備的類

import lombok.AllArgsConstructor;
import lombok.Data;

@AllArgsConstructor
@Data
class Order {
	/**
	 * 訂單號
	 */
    private String orderNum;
    
    /**
	 * 付款時間
	 */
    private String payTime;
    
    /**
	 * 支付金額
	 */
    private Integer actualAmount;
}

方法一

import java.util.ArrayList;
import java.util.List;

public class TestTimeSort {
	public static void main(String[] args) {
		Order order1 = new Order("1101", "2019-11-03 00:30:31", 100);
		Order order2 = new Order("1102", "2019-11-03 00:30:32", 200);
		Order order3 = new Order("1103", "2019-11-03 00:30:33", 300);
		Order order4 = new Order("1104", "2019-11-03 00:30:34", 400);
		Order order5 = new Order("1105", "2019-11-03 00:30:35", 500);
		List<Order> orders = new ArrayList<>();
		orders.add(order2);
		orders.add(order1);
		orders.add(order4);
		orders.add(order3);
		orders.add(order5);
		System.out.println("------------排序前-----------------");
		for (Order order : orders) {
			System.out.println("orderNum=" + order.getOrderNum() + ",payTime=" + order.getPayTime());
		}
        //不管是Date、String、Long類型的日期都可以排序,無需轉換
		orders.sort((t1, t2) -> t2.getPayTime().compareTo(t1.getPayTime()));
		System.out.println("------------倒序後-----------------");
		for (Order order : orders) {
			System.out.println("orderNum=" + order.getOrderNum() + ",payTime=" + order.getPayTime());
		}
	}
}

方法二

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class TestTimeSort {
	public static void main(String[] args) {
		Order order1 = new Order("1101", "2019-11-03 00:30:31", 100);
		Order order2 = new Order("1102", "2019-11-03 00:30:32", 200);
		Order order3 = new Order("1103", "2019-11-03 00:30:33", 300);
		Order order4 = new Order("1104", "2019-11-03 00:30:34", 400);
		Order order5 = new Order("1105", "2019-11-03 00:30:35", 500);
		List<Order> orders = new ArrayList<>();
		orders.add(order2);
		orders.add(order1);
		orders.add(order4);
		orders.add(order3);
		orders.add(order5);
		System.out.println("------------排序前-----------------");
		for (Order order : orders) {
			System.out.println("orderNum=" + order.getOrderNum() + ",payTime=" + order.getPayTime());
		}
        //利用stream,需要把字符串日期轉換爲時間戳
		 orders = orders.stream().sorted((t1,t2) -> 
		 			Long.compare(convertTimeToLong(t2.getPayTime()), convertTimeToLong(t1.getPayTime()))).
				 collect(Collectors.toList());
		System.out.println("------------倒序後-----------------");
		for (Order order : orders) {
			System.out.println("orderNum=" + order.getOrderNum() + ",payTime=" + order.getPayTime());
		}
	}
    
    /**
     * 將字符串轉日期成Long類型的時間戳,格式爲:yyyy-MM-dd HH:mm:ss
     */
    public static Long convertTimeToLong(String time) { 
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime parse = LocalDateTime.parse(time, formatter);
        return LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }  
}

方法三

import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Comparator;

public class TestTimeSort {
	public static void main(String[] args) {
		Order order1 = new Order("1101", "2019-11-03 00:30:31", 100);
		Order order2 = new Order("1102", "2019-11-03 00:30:32", 200);
		Order order3 = new Order("1103", "2019-11-03 00:30:33", 300);
		Order order4 = new Order("1104", "2019-11-03 00:30:34", 400);
		Order order5 = new Order("1105", "2019-11-03 00:30:35", 500);
		List<Order> orders = new ArrayList<>();
		orders.add(order2);
		orders.add(order1);
		orders.add(order4);
		orders.add(order3);
		orders.add(order5);
		System.out.println("------------排序前-----------------");
		for (Order order : orders) {
			System.out.println("orderNum=" + order.getOrderNum() + ",payTime=" + order.getPayTime());
		}
        //利用Comparator接口實現,java8的寫法
		Collections.sort(orders, Comparator.comparing(Order::getPayTime, (t1, t2) -> t2.compareTo(t1)));
		System.out.println("------------倒序後-----------------");
		for (Order order : orders) {
			System.out.println("orderNum=" + order.getOrderNum() + ",payTime=" + order.getPayTime());
		}
	}
}

方法四

import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Comparator;

public class TestTimeSort {
	public static void main(String[] args) {
		Order order1 = new Order("1101", "2019-11-03 00:30:31", 100);
		Order order2 = new Order("1102", "2019-11-03 00:30:32", 200);
		Order order3 = new Order("1103", "2019-11-03 00:30:33", 300);
		Order order4 = new Order("1104", "2019-11-03 00:30:34", 400);
		Order order5 = new Order("1105", "2019-11-03 00:30:35", 500);
		List<Order> orders = new ArrayList<>();
		orders.add(order2);
		orders.add(order1);
		orders.add(order4);
		orders.add(order3);
		orders.add(order5);
		System.out.println("------------排序前-----------------");
		for (Order order : orders) {
			System.out.println("orderNum=" + order.getOrderNum() + ",payTime=" + order.getPayTime());
		}
        //利用Comparator接口實現,java8之前通常這樣寫
		Collections.sort(orders,new Comparator<Order>(){
			@Override
			public int compare(Order o1, Order o2) {
				return o2.getPayTime().compareTo(o1.getPayTime());
			}
		});
		System.out.println("------------倒序後-----------------");
		for (Order order : orders) {
			System.out.println("orderNum=" + order.getOrderNum() + ",payTime=" + order.getPayTime());
		}
	}
}

四種方法最後輸出如下

------------排序前-----------------
orderNum=1102,payTime=2019-11-03 00:30:32
orderNum=1101,payTime=2019-11-03 00:30:31
orderNum=1104,payTime=2019-11-03 00:30:34
orderNum=1103,payTime=2019-11-03 00:30:33
orderNum=1105,payTime=2019-11-03 00:30:35
------------倒序後-----------------
orderNum=1105,payTime=2019-11-03 00:30:35
orderNum=1104,payTime=2019-11-03 00:30:34
orderNum=1103,payTime=2019-11-03 00:30:33
orderNum=1102,payTime=2019-11-03 00:30:32
orderNum=1101,payTime=2019-11-03 00:30:31
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章