初探12306售票算法(二)-java代码实践
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了初探12306售票算法(二)-java代码实践,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8962字,纯文字阅读大概需要13分钟。
内容图文
周五闲来无事,基于上一篇关于初探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;//票据id11private String ticketFlag;//订票标记12private String seatType;//座位类型13private String fromDate;//发车日期14private String trainNO;//列车编号15privateint saleChannel;//销售渠道16public String getOrderId() { 17return orderId; 18 } 19publicvoid setOrderId(String orderId) { 20this.orderId = orderId; 21 } 22public String getTicketGuid() { 23return ticketGuid; 24 } 25publicvoid setTicketGuid(String ticketGuid) { 26this.ticketGuid = ticketGuid; 27 } 28public String getTicketFlag() { 29return ticketFlag; 30 } 31publicvoid setTicketFlag(String ticketFlag) { 32this.ticketFlag = ticketFlag; 33 } 34public String getSeatType() { 35return seatType; 36 } 37publicvoid setSeatType(String seatType) { 38this.seatType = seatType; 39 } 40public String getFromDate() { 41return fromDate; 42 } 43publicvoid setFromDate(String fromDate) { 44this.fromDate = fromDate; 45 } 46public String getTrainNO() { 47return trainNO; 48 } 49publicvoid setTrainNO(String trainNO) { 50this.trainNO = trainNO; 51 } 52publicint getSaleChannel() { 53return saleChannel; 54 } 55publicvoid setSaleChannel(int saleChannel) { 56this.saleChannel = saleChannel; 57 } 585960 }
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;//发车日期1415public String getGuid() { 16return guid; 17 } 1819publicvoid setGuid(String guid) { 20this.guid = guid; 21 } 2223public String getTrainNo() { 24return trainNo; 25 } 2627publicvoid setTrainNo(String trainNo) { 28this.trainNo = trainNo; 29 } 303132public String getTicketFlag() { 33return ticketFlag; 34 } 3536publicvoid setTicketFlag(String ticketFlag) { 37this.ticketFlag = ticketFlag; 38 } 3940public String getTicketType() { 41return ticketType; 42 } 4344publicvoid setTicketType(String ticketType) { 45this.ticketType = ticketType; 46 } 4748publicint getSaleChannel() { 49return saleChannel; 50 } 5152publicvoid setSaleChannel(int saleChannel) { 53this.saleChannel = saleChannel; 54 } 5556public String getFromDate() { 57return fromDate; 58 } 5960publicvoid setFromDate(String fromDate) { 61this.fromDate = fromDate; 62 } 6364 }
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;// 火车编号11privateint stationNum;// 车站数量12private Map<String, Integer> seatTotalNum;// 各种座位的数量13private String fromDate; 141516public String getFromDate() { 17return fromDate; 18 } 1920publicvoid setFromDate(String fromDate) { 21this.fromDate = fromDate; 22 } 2324public String getTrainNo() { 25return trainNo; 26 } 2728publicvoid setTrainNo(String trainNo) { 29this.trainNo = trainNo; 30 } 3132publicint getStationNum() { 33return stationNum; 34 } 3536publicvoid setStationNum(int stationNum) { 37this.stationNum = stationNum; 38 } 3940public Map<String, Integer> getSeatTotalNum() { 41return seatTotalNum; 42 } 4344publicvoid setSeatTotalNum(Map<String, Integer> seatTotalNum) { 45this.seatTotalNum = seatTotalNum; 46 } 4748 }
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); 33if(f.exists()) f.delete(); 34long 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("开始订票"); 42long beginTime = System.currentTimeMillis(); 43 List<Order> orderResult = new ArrayList<Order>(); 4445for (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);4950 List<Order> tempListOrder = CommonUtil.createOrderList(ticketStr, 51 ticketList, train); 52 orderResult.addAll(tempListOrder); 5354 } 55long endTime = System.currentTimeMillis(); 56 System.out.println("订票完成"); 57//int m = 0; 5859// 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// }7980long 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)); 8485 System.out.println("执行完毕"); 8687 } 8889 }
6.运行结果
完整代码: 源码
本文原创:转载请注明出处 http://www.cnblogs.com/feichengwurao/p/5202100.html
原文:http://www.cnblogs.com/feichengwurao/p/5202100.html
内容总结
以上是互联网集市为您收集整理的初探12306售票算法(二)-java代码实践全部内容,希望文章能够帮你解决初探12306售票算法(二)-java代码实践所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。