package com.gblfy.gxts;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Before;
import org.junit.Test;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* 案例5:
* 在股票中,撮合交易的原则是一点时间内的交易申请,价格越高的先成交;
* 价格一样,下单时间最早的先成交;价格和时间一致,交易量大的先成交;
* 如果价格、时间、交易量都一致,机构先成交,散户最后成交。
* 现有一批交易申请数据,需要确认交易先后顺序。
*/
public class CaseFive {
/**
* 交易实体模型
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
class Trade {
/**
* 下单价格
*/
private BigDecimal price;
/**
* 下单时间
*/
private LocalDateTime time;
/**
* 下单量
*/
private Integer count;
/**
* 下单类型: 机构 / 个人
*/
private String type;
}
/**
* 一段时间内的交易申请
*/
List<Trade> tradeList;
//初始化顺序
@Before
public void init() {
tradeList = new ArrayList<>();
tradeList.add(new Trade(new BigDecimal(100),
LocalDateTime.now().plusSeconds(1),
500, "机构"));
tradeList.add(new Trade(new BigDecimal(101),
LocalDateTime.now().plusSeconds(2),
1, "个人"));
tradeList.add(new Trade(new BigDecimal(101),
LocalDateTime.now().plusSeconds(1),
1, "个人"));
tradeList.add(new Trade(new BigDecimal(100),
LocalDateTime.now().plusSeconds(1),
500, "个人"));
tradeList.add(new Trade(new BigDecimal(100),
LocalDateTime.now().plusSeconds(0),
2, "个人"));
tradeList.add(new Trade(new BigDecimal(100),
LocalDateTime.now().plusSeconds(0),
100, "机构"));
}
/**
* 对交易信息排序后的列表
*/
@Test
public void sortTrade() {
System.out.println(JSON.toJSONString(tradeList, true));
List<Trade> tradeResulltList = tradeList.stream()
.sorted(Comparator
//首先按照价格排序
.comparing(Trade::getPrice,
//TODO 进行排序调整,将自然排序翻转
Comparator.reverseOrder())
//按照交易时间,自然排序
.thenComparing(Trade::getTime)
//交易量排序,自然排序翻转
.thenComparing(Trade::getCount,
//TODO 进行排序调整,将自然排序翻转
Comparator.reverseOrder())
//自定义排序规则
.thenComparing(
//要排序的字段值
Trade::getType,
//自定义排序规则
(type1, type2) -> {
if ("机构".equals(type1) && "个人".equals(type1)) {
//-1:type1在先, type2在后
return -1;
} else if ("个人".equals(type1) && "机构".equals(type2)) {
//1:type2在先, type1在后
return 1;
} else {
//0:不分先后
return 0;
}
}
)
).collect(Collectors.toList());
System.out.println("排序后的结果:" + JSON.toJSONString(tradeResulltList, true));
}
}