Java代码实践12306售票算法(二)

周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述)

1.订票工具类

1.1初始化一列车厢的票据信息

/**
* 生成Ticket信息
*
* @param train
* @return
*/
public static List<Ticket> initTicketList(Train train) {
List<Ticket> result = new ArrayList<Ticket>();
Map<String, Integer> seatMap = train.getSeatTotalNum();
for (Entry<String, Integer> entry : seatMap.entrySet()) {
int ticketSize = entry.getValue();
String ticketType = entry.getKey();
for (int i = 0; i < ticketSize; i++) {
int saleChannel = (int) (Math.random() * 10) % 8;
Ticket ticket = new Ticket();
ticket.setSaleChannel(saleChannel);
ticket.setTicketType(ticketType);
ticket.setGuid(UUID.randomUUID().toString());
ticket.setFromDate(train.getFromDate());
ticket.setTicketFlag(CommonUtil.initTicketFlag(train));
ticket.setTrainNo(train.getTrainNo());
result.add(ticket);
}
}
return result;
}

1.2 生成站点购票(比如说第进行移位即可如第1站1,第二站‘10' 这里返回的十进制的)

/**
* 创建
* @param i
* @param stationNum
* @return
*/
public static String buidTicket(int i, int stationNum) {
BigInteger temp = new BigInteger("0");
for (int j = i; j < stationNum; j++) {
temp = temp.or(new BigInteger(buidTicket(j)));
}
return temp.shiftRight(1).toString();
}

1.3 订票主程序,这里一次只定一张票(A=A|B)

/**
* 根据筛选条件取得对应的车次
* @param ticketStr
* @param ticketList
* @param condition
* @return
*/
public static Order createOrderByCondition(String ticketStr,List<Ticket> ticketList,Map condition){
Order tempOrder = null;
for (Ticket ticket : ticketList) {
BigInteger toTicket = new BigInteger(ticketStr);
BigInteger fromTicket = new BigInteger(ticket.getTicketFlag());
// 如果可以订票,那么久进行扣除库存&&
// (ticket.getSaleChannel()==(ticket.getSaleChannel()|1))
if (canTicket(fromTicket, toTicket)
&&ticket.getTicketType().equals(condition.get("ticketType").toString())
//&&(ticket.getSaleChannel()==(ticket.getSaleChannel()|2))
) {
tempOrder = new Order();
tempOrder.setOrderId(UUID.randomUUID().toString());
tempOrder.setSeatType(ticket.getTicketType());
tempOrder.setTicketFlag(toTicket.toString());
tempOrder.setTrainNO(ticket.getTrainNo());
tempOrder.setFromDate(ticket.getFromDate());
tempOrder.setSaleChannel(ticket.getSaleChannel());
tempOrder.setTicketGuid(ticket.getGuid());
ticket.setTicketFlag(fromTicket.or(toTicket).toString());
break;
}
}
return tempOrder;
}

1.4 判断是否邮票,A=~(~A|B)

/**
* 订票判断是否可以订票
*
* @param fromTicket
* @param toTicket
* @return
*/
private static boolean canTicket(BigInteger fromTicket, BigInteger toTicket) {
return fromTicket.equals(fromTicket.not().or(toTicket).not());
}

2.订单实体(保留必要的订单信息)

package com.train.ticket;
/**
* 订单实体
* @author guo_zhifeng
*
*/
public class Order {

private String orderId;
private String ticketGuid;//票据id
private String ticketFlag;//订票标记
private String seatType;//座位类型
private String fromDate;//发车日期
private String trainNO;//列车编号
private int saleChannel;//销售渠道
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getTicketGuid() {
return ticketGuid;
}
public void setTicketGuid(String ticketGuid) {
this.ticketGuid = ticketGuid;
}
public String getTicketFlag() {
return ticketFlag;
}
public void setTicketFlag(String ticketFlag) {
this.ticketFlag = ticketFlag;
}
public String getSeatType() {
return seatType;
}
public void setSeatType(String seatType) {
this.seatType = seatType;
}
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
public String getTrainNO() {
return trainNO;
}
public void setTrainNO(String trainNO) {
this.trainNO = trainNO;
}
public int getSaleChannel() {
return saleChannel;
}
public void setSaleChannel(int saleChannel) {
this.saleChannel = saleChannel;
}
}

3.票务实体(保留必要的票务信息)

package com.train.ticket;
/**
* 票务实体
* @author guo_zhifeng
*
*/
public class Ticket {
private String ticketFlag;
private String ticketType;
private int saleChannel;
private String trainNo;
private String guid;
private String fromDate;//发车日期
public String getGuid() {
return guid;
}
public void setGuid(String guid) {
this.guid = guid;
}
public String getTrainNo() {
return trainNo;
}
public void setTrainNo(String trainNo) {
this.trainNo = trainNo;
}
public String getTicketFlag() {
return ticketFlag;
}
public void setTicketFlag(String ticketFlag) {
this.ticketFlag = ticketFlag;
}
public String getTicketType() {
return ticketType;
}
public void setTicketType(String ticketType) {
this.ticketType = ticketType;
}
public int getSaleChannel() {
return saleChannel;
}
public void setSaleChannel(int saleChannel) {
this.saleChannel = saleChannel;
}
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
}

4.列车初始化信息(只进行主要信息)

package com.train.ticket;
import java.util.Map;
/**
* 某一趟的列车的信息
* @author guo_zhifeng
*
*/
public class Train {
private String trainNo;// 火车编号
private int stationNum;// 车站数量
private Map<String, Integer> seatTotalNum;// 各种座位的数量
private String fromDate;
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
public String getTrainNo() {
return trainNo;
}
public void setTrainNo(String trainNo) {
this.trainNo = trainNo;
}
public int getStationNum() {
return stationNum;
}
public void setStationNum(int stationNum) {
this.stationNum = stationNum;
}
public Map<String, Integer> getSeatTotalNum() {
return seatTotalNum;
}
public void setSeatTotalNum(Map<String, Integer> seatTotalNum) {
this.seatTotalNum = seatTotalNum;
}
}

5.主程序

5.1初始化一列车厢

5.2按照逐站购票的形式,最大化 即 AB BC CD DE EF等等

5.3输出耗时时间

package com.train.main;
import java.io.File;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.train.ticket.Order;
import com.train.ticket.Ticket;
import com.train.ticket.Train;
import com.train.util.CommonUtil;
public class MainTest {
public static void main(String[] args) {
Train train = new Train();
train.setTrainNo("SA");
train.setFromDate("//");
train.setStationNum();
Map<String, Integer> seatMap = new HashMap<String, Integer>();
seatMap.put("商务座", );
seatMap.put("一等座", );
seatMap.put("二等座", );
train.setSeatTotalNum(seatMap);
// 生成票据
System.out.println("初始化列车中的票");
List<Ticket> ticketList = CommonUtil.initTicketList(train);
String fileName = "D:\\RESULT.txt";
File f = new File(fileName);
if(f.exists()) f.delete();
long startTime = System.currentTimeMillis();
//int i = ;
//for (Ticket ticket : ticketList) {
// CommonUtil.appendMethodA(fileName,
// i + "||" + CommonUtil.toJSON(ticket) + "\n", true);
// i++;
//}
System.out.println("开始订票");
long beginTime = System.currentTimeMillis();
List<Order> orderResult = new ArrayList<Order>();
for (int j = ; j < train.getStationNum() - ; j++) {
String ticketStr = CommonUtil.buidTicket(j);
//String ticketStr = CommonUtil.buidTicket(,train.getStationNum());;
//System.exit();
List<Order> tempListOrder = CommonUtil.createOrderList(ticketStr,
ticketList, train);
orderResult.addAll(tempListOrder);
}
long endTime = System.currentTimeMillis();
System.out.println("订票完成");
//int m = ;

// for (Ticket ticket : ticketList) {
// String temp = m + "||" + CommonUtil.toJSON(ticket) + ",";
// // System.out.println(temp);
// CommonUtil.appendMethodA(fileName, temp, true);
// m++;
// }
// int k = ;
// for (Order order : orderResult) {
// String temp = order.getOrderId()
// + "||" + order.getSaleChannel()
// + "||" + order.getFromDate()
// + "||" + order.getSeatType()
// + "||" + order.getTicketGuid()
// + "||" + order.getTrainNO()
// + "||" + order.getTicketFlag()
// + "||" + new BigInteger(order.getTicketFlag()).toString()
// + "||" +k;
// CommonUtil.appendMethodA(fileName,temp, true);
// k++;
// }

long eedTime = System.currentTimeMillis();
System.out.println("生成订单" + orderResult.size() + "||耗时时间:"
+ (endTime - beginTime) + "毫秒");
System.out.println("每秒钟生成单据数(逐张订票)"+ new BigDecimal(orderResult.size()).multiply(new BigDecimal()).divide(new BigDecimal(endTime - beginTime),,BigDecimal.ROUND_HALF_DOWN));
System.out.println("执行完毕");
}
}

6.运行结果

以上所述是小编给大家介绍的Java代码实践12306售票算法(二),希望对大家有所帮助!

(0)

相关推荐

  • 浅析12306售票算法(java版)

    1.以G71列车为例,首先对车次站台进行占位编码(从1开始到最后一站递加) 对以上占位简单描述以下:G71总共18个站点那么我们的单个座位的座位标识可以用十八位长度的二进制字符串表示10000000000000000每一位代表一个站点,每天放票前初始化到下面的订票表中,数据如下余票根据座位标识中的0的个数决定最大余票数量 订票表中的始发受限站点和终到受限站点可以灵活搭配(这个就可以实现限制站点发售) 2.查询余票 如果我们要查询日期为2016-06-11,始发站保定东站(3)到韶关站(15)的G

  • Java代码实践12306售票算法(二)

    周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成Ticket信息 * * @param train * @return */ public static List<Ticket> initTicketList(Train train) { List<Ticket> result = new ArrayList<Ticket&g

  • 70行Java代码实现深度神经网络算法分享

    对于现在流行的深度学习,保持学习精神是必要的--程序员尤其是架构师永远都要对核心技术和关键算法保持关注和敏感,必要时要动手写一写掌握下来,先不用关心什么时候用到--用不用是政治问题,会不会写是技术问题,就像军人不关心打不打的问题,而要关心如何打赢的问题. 程序员如何学习机器学习 对程序员来说,机器学习是有一定门槛的(这个门槛也是其核心竞争力),相信很多人在学习机器学习时都会为满是数学公式的英文论文而头疼,甚至可能知难而退.但实际上机器学习算法落地程序并不难写,下面是70行代码实现的反向多层(BP

  • Java实现8种排序算法的示例代码

    冒泡排序 O(n2) 两个数比较大小,较大的数下沉,较小的数冒起来. public static void bubbleSort(int[] a) { //临时变量 int temp; //i是循环次数,也是冒泡的结果位置下标,5个数组循环5次 for (int i = 0; i < a.length; i++) { //从最后向前面两两对比,j是比较中下标大的值 for (int j = a.length - 1; j > i; j--) { //让小的数字排在前面 if (a[j] <

  • 详解Java Fibonacci Search斐波那契搜索算法代码实现

    一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等分割.此搜索需要对数组进行排序. 与二进制搜索不同,在二进制搜索中,我们将元素分成相等的两半以减小数组范围-在斐波那契搜索中,我们尝试使用加法或减法来获得较小的范围. 斐波那契数列的公式是: Fibo(N)=Fibo(N-1)+Fibo(N-2) 此系列的前两个数字是Fibo(0) = 0和Fibo

  • Java实现世界上最快的排序算法Timsort的示例代码

    目录 背景 前置知识 指数搜索 二分插入排序 归并排序 Timsort 执行过程 升序运行 几个关键阀值 运行合并 合并条件 合并内存开销 合并优化 背景 Timsort 是一个混合.稳定的排序算法,简单来说就是归并排序和二分插入排序算法的混合体,号称世界上最好的排序算法.Timsort一直是 Python 的标准排序算法.Java SE 7 后添加了Timsort API ,我们从Arrays.sort可以看出它已经是非原始类型数组的默认排序算法了.所以不管是进阶编程学习还是面试,理解 Tim

  • Java实现常见的排序算法的示例代码

    目录 一.优化后的冒泡排序 二.选择排序 三.插入排序 四.希尔排序 五.快速排序 六.随机化快速排序 七.归并排序 八.可处理负数的基数排序 一.优化后的冒泡排序 package com.yzh.sort; /* 冒泡排序 */ @SuppressWarnings({"all"}) public class BubbleSort { public static void BubbleSort(int[]a){ for (int i = 0; i <a.length-1 ; i+

  • java实现的各种排序算法代码示例

    折半插入排序 折半插入排序是对直接插入排序的简单改进.此处介绍的折半插入,其实就是通过不断地折半来快速确定第i个元素的 插入位置,这实际上是一种查找算法:折半查找.Java的Arrays类里的binarySearch()方法,就是折半查找的实现,用 于从指定数组中查找指定元素,前提是该数组已经处于有序状态.与直接插入排序的效果相同,只是更快了一些,因 为折半插入排序可以更快地确定第i个元素的插入位置 代码: package interview; /** * @author Administrat

  • Java版超大整数阶乘算法代码详解-10,0000级

    当计算超过20以上的阶乘时,阶乘的结果值往往会很大.一个很小的数字的阶乘结果就可能超过目前个人计算机的整数范围.如果需求很大的阶乘,比如1000以上完全无法用简单的递归方式去解决.在网上我看到很多用C.C++和C#写的一些关于大整数阶乘的算法,其中不乏经典但也有很多粗糙的文章.数组越界,一眼就可以看出程序本身无法运行.转载他人文章的时候,代码倒是仔细看看啊.唉,粗糙.过年了,在家闲来蛋疼,仔细分析分析,用Java实现了一个程序计算超大整数阶乘.思想取自网上,由我个人优化和改进. 这个方法采用"数

  • 如何通过Java代码实现KMP算法

    这篇文章主要介绍了如何通过Java代码实现KMP算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数, 函数本身包含了模式串的局部匹配信息.时间复

随机推荐