初探12306售票算法(二)-java代码实践

周五闲来无事,基于上一篇关于初探12306售票算法(一)-理论,进行了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.订单实体(保留必要的订单信息)

 1 package com.train.ticket;
 2 /**
 3  * 订单实体
 4  * @author guo_zhifeng
 5  *
 6  */
 7 public class Order {
 8
 9     private String orderId;
10     private String ticketGuid;//票据id
11     private String ticketFlag;//订票标记
12     private String seatType;//座位类型
13     private String fromDate;//发车日期
14     private String trainNO;//列车编号
15     private int saleChannel;//销售渠道
16     public String getOrderId() {
17         return orderId;
18     }
19     public void setOrderId(String orderId) {
20         this.orderId = orderId;
21     }
22     public String getTicketGuid() {
23         return ticketGuid;
24     }
25     public void setTicketGuid(String ticketGuid) {
26         this.ticketGuid = ticketGuid;
27     }
28     public String getTicketFlag() {
29         return ticketFlag;
30     }
31     public void setTicketFlag(String ticketFlag) {
32         this.ticketFlag = ticketFlag;
33     }
34     public String getSeatType() {
35         return seatType;
36     }
37     public void setSeatType(String seatType) {
38         this.seatType = seatType;
39     }
40     public String getFromDate() {
41         return fromDate;
42     }
43     public void setFromDate(String fromDate) {
44         this.fromDate = fromDate;
45     }
46     public String getTrainNO() {
47         return trainNO;
48     }
49     public void setTrainNO(String trainNO) {
50         this.trainNO = trainNO;
51     }
52     public int getSaleChannel() {
53         return saleChannel;
54     }
55     public void setSaleChannel(int saleChannel) {
56         this.saleChannel = saleChannel;
57     }
58
59
60 }

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

 1 package com.train.ticket;
 2 /**
 3  * 票务实体
 4  * @author guo_zhifeng
 5  *
 6  */
 7 public class Ticket {
 8     private String ticketFlag;
 9     private String ticketType;
10     private int saleChannel;
11     private String trainNo;
12     private String guid;
13     private String fromDate;//发车日期
14
15     public String getGuid() {
16         return guid;
17     }
18
19     public void setGuid(String guid) {
20         this.guid = guid;
21     }
22
23     public String getTrainNo() {
24         return trainNo;
25     }
26
27     public void setTrainNo(String trainNo) {
28         this.trainNo = trainNo;
29     }
30
31
32     public String getTicketFlag() {
33         return ticketFlag;
34     }
35
36     public void setTicketFlag(String ticketFlag) {
37         this.ticketFlag = ticketFlag;
38     }
39
40     public String getTicketType() {
41         return ticketType;
42     }
43
44     public void setTicketType(String ticketType) {
45         this.ticketType = ticketType;
46     }
47
48     public int getSaleChannel() {
49         return saleChannel;
50     }
51
52     public void setSaleChannel(int saleChannel) {
53         this.saleChannel = saleChannel;
54     }
55
56     public String getFromDate() {
57         return fromDate;
58     }
59
60     public void setFromDate(String fromDate) {
61         this.fromDate = fromDate;
62     }
63
64 }

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

 1 package com.train.ticket;
 2
 3 import java.util.Map;
 4 /**
 5  * 某一趟的列车的信息
 6  * @author guo_zhifeng
 7  *
 8  */
 9 public class Train {
10     private String trainNo;// 火车编号
11     private int stationNum;// 车站数量
12     private Map<String, Integer> seatTotalNum;// 各种座位的数量
13     private String fromDate;
14
15
16     public String getFromDate() {
17         return fromDate;
18     }
19
20     public void setFromDate(String fromDate) {
21         this.fromDate = fromDate;
22     }
23
24     public String getTrainNo() {
25         return trainNo;
26     }
27
28     public void setTrainNo(String trainNo) {
29         this.trainNo = trainNo;
30     }
31
32     public int getStationNum() {
33         return stationNum;
34     }
35
36     public void setStationNum(int stationNum) {
37         this.stationNum = stationNum;
38     }
39
40     public Map<String, Integer> getSeatTotalNum() {
41         return seatTotalNum;
42     }
43
44     public void setSeatTotalNum(Map<String, Integer> seatTotalNum) {
45         this.seatTotalNum = seatTotalNum;
46     }
47
48 }

5.主程序

5.1初始化一列车厢

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

5.3输出耗时时间

 1 package com.train.main;
 2
 3 import java.io.File;
 4 import java.math.BigDecimal;
 5 import java.math.BigInteger;
 6 import java.util.ArrayList;
 7 import java.util.HashMap;
 8 import java.util.List;
 9 import java.util.Map;
10
11 import com.train.ticket.Order;
12 import com.train.ticket.Ticket;
13 import com.train.ticket.Train;
14 import com.train.util.CommonUtil;
15
16 public class MainTest {
17
18     public static void main(String[] args) {
19         Train train = new Train();
20         train.setTrainNo("0909123SA873878");
21         train.setFromDate("2016/06/11");
22         train.setStationNum(18);
23         Map<String, Integer> seatMap = new HashMap<String, Integer>();
24         seatMap.put("商务座", 500);
25         seatMap.put("一等座", 1000);
26         seatMap.put("二等座", 2000);
27         train.setSeatTotalNum(seatMap);
28         // 生成票据
29         System.out.println("初始化列车中的票");
30         List<Ticket> ticketList = CommonUtil.initTicketList(train);
31         String fileName = "D:\\RESULT.txt";
32         File f = new File(fileName);
33         if(f.exists()) f.delete();
34         long startTime = System.currentTimeMillis();
35         //int i = 0;
36         //for (Ticket ticket : ticketList) {
37         //    CommonUtil.appendMethodA(fileName,
38         //            i + "||" + CommonUtil.toJSON(ticket) + "\n", true);
39         //    i++;
40         //}
41         System.out.println("开始订票");
42         long beginTime = System.currentTimeMillis();
43         List<Order> orderResult = new ArrayList<Order>();
44
45         for (int j = 0; j < train.getStationNum() - 1; j++) {
46             String ticketStr = CommonUtil.buidTicket(j);
47             //String ticketStr = CommonUtil.buidTicket(1,train.getStationNum());;
48             //System.exit(0);
49
50             List<Order> tempListOrder = CommonUtil.createOrderList(ticketStr,
51                     ticketList, train);
52             orderResult.addAll(tempListOrder);
53
54         }
55         long endTime = System.currentTimeMillis();
56         System.out.println("订票完成");
57         //int m = 0;
58
59 //        for (Ticket ticket : ticketList) {
60 //            String temp = m + "||" + CommonUtil.toJSON(ticket) + ",";
61 //            // System.out.println(temp);
62 //            CommonUtil.appendMethodA(fileName, temp, true);
63 //            m++;
64 //        }
65 //        int k = 1;
66 //        for (Order order : orderResult) {
67 //            String temp =     order.getOrderId()
68 //                            + "||" + order.getSaleChannel()
69 //                            + "||" + order.getFromDate()
70 //                            + "||" + order.getSeatType()
71 //                            + "||" + order.getTicketGuid()
72 //                            + "||" + order.getTrainNO()
73 //                            + "||" + order.getTicketFlag()
74 //                            + "||" + new BigInteger(order.getTicketFlag()).toString(2)
75 //                            + "||" +k;
76 //            CommonUtil.appendMethodA(fileName,temp, true);
77 //            k++;
78 //        }
79
80         long eedTime = System.currentTimeMillis();
81         System.out.println("生成订单" + orderResult.size() + "||耗时时间:"
82                 + (endTime - beginTime) + "毫秒");
83         System.out.println("每秒钟生成单据数(逐张订票)"+ new BigDecimal(orderResult.size()).multiply(new BigDecimal(1000)).divide(new BigDecimal(endTime - beginTime),0,BigDecimal.ROUND_HALF_DOWN));
84
85         System.out.println("执行完毕");
86
87     }
88
89 }

6.运行结果

完整代码: 源码

本文原创:转载请注明出处 http://www.cnblogs.com/feichengwurao/p/5202100.html

时间: 2024-10-03 23:04:01

初探12306售票算法(二)-java代码实践的相关文章

初探12306售票算法

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

对一致性Hash算法,Java代码实现的深入研究

一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在

【转载】对一致性Hash算法,Java代码实现的深入研究

原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这

算法9-5:最大流算法的Java代码

残留网络 在介绍最大流算法之前先介绍一下什么是残留网络.残余网络的概念有点类似于集合中的补集概念. 下图是残余网络的例子.上面的网络是原始网络,下面的网络是计算出的残留网络.残留网络的作用就是用来描述这个网络中还剩下多少可以利用的流量. 流量网络 最大流算法比以前介绍的算法都要复杂.网络中的每一条边需要记录容量和当前流量.容量是固定值,是已知条件,而当前流量在计算过程中会一直发生变化.因此,需要建立一个专门的类,用于最大流算法. public class FlowEdge { private i

利用朴素贝叶斯算法进行分类-Java代码实现

http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现 鳄鱼  3个月前 (12-14)  分类:机器学习  阅读(44)  评论(0) Java package cn.crocro.classifier; import java.util.ArrayList; /** * 朴素贝叶斯分类器,只能针对有限个情况的分类下面是实例代码 * * @author 鳄鱼 * */ public class NaiveBayesClassifier

编辑距离和编辑距离的动态规划算法(Java代码)

编辑距离概念描述: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 编辑距离的应用在信息检索.拼写纠错.机器翻译.命名实体抽取.同义词寻找等问题中有较多的应用 问题:找出

几种简单的负载均衡算法及其Java代码实现

什么是负载均衡 负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求.负载均衡能够平均分配客户请求到服务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能. 负载均衡分为软件负载均衡和硬件负载均衡,前者的代

经典图算法Java代码实践:BFS,DFS以及几种最短路径算法

public class City { String name; int id; static int idCounter = 0; public City(String name) { this.name=name; id = idCounter++; } } import java.util.ArrayList; public class Graph { public static void main(String[] args) { // TODO Auto-generated metho

算法,java代码实现打印万年历

万年历 以1900年1月1号星期一为时间原点 星期日 第一天 星期一 第二天 星期二 第三天 星期三 第四天 星期四 第五天 星期五 第六天 星期六 第七天 1.计算出当前日期距离原点的天数(例:2016/9/18) 2015到1900之间有多少个瑞年和平年-->count1 2016年一月到八月的总天数-->count2 本月的一号 count = count1+count2+1 2.计算出本月的一号是一周的第几天 k = count%7;(打印一号前面有多少空格) 3.计算出该月有多少天