初探12306售票算法(二)-java代码实践
2016-02-19 20:40
841 查看
周五闲来无事,基于上一篇关于初探12306售票算法(一)-理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述)
1.2 生成站点购票(比如说第进行移位即可如第1站1,第二站‘10’ 这里返回的十进制的)
1.3 订票主程序,这里一次只定一张票(A=A|B)
1.4 判断是否邮票,A=~(~A|B)
View Code
6.运行结果
完整代码: 源码
本文原创:转载请注明出处 /article/5246060.html
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.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("0909123SA873878"); train.setFromDate("2016/06/11"); train.setStationNum(18); Map<String, Integer> seatMap = new HashMap<String, Integer>(); seatMap.put("商务座", 500); seatMap.put("一等座", 1000); seatMap.put("二等座", 2000); 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 = 0; //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 = 0; j < train.getStationNum() - 1; j++) { String ticketStr = CommonUtil.buidTicket(j); //String ticketStr = CommonUtil.buidTicket(1,train.getStationNum());; //System.exit(0); List<Order> tempListOrder = CommonUtil.createOrderList(ticketStr, ticketList, train); orderResult.addAll(tempListOrder); } long endTime = System.currentTimeMillis(); System.out.println("订票完成"); //int m = 0; // for (Ticket ticket : ticketList) { // String temp = m + "||" + CommonUtil.toJSON(ticket) + ","; // // System.out.println(temp); // CommonUtil.appendMethodA(fileName, temp, true); // m++; // } // int k = 1; // 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(2) // + "||" +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(1000)).divide(new BigDecimal(endTime - beginTime),0,BigDecimal.ROUND_HALF_DOWN)); System.out.println("执行完毕"); } }
View Code
6.运行结果
完整代码: 源码
本文原创:转载请注明出处 /article/5246060.html
相关文章推荐
- java文件操作+流的使用
- java:堆栈,队列,枚举,链表
- spring InitializingBean init-method postConstruct 执行顺序
- java排序(选择排序+插入排序+冒泡排序+递归)
- java数组(一维数组,二维数组)
- java面向对象小总结
- Java实现KMP算法
- Eclipse 配置SSH 详解
- 最终有SpringMvc与Struts2的对照啦
- java核心技术学习笔记(一)
- Java中print、printf、println的区别
- java的Frame和JFrame中的paint方法区别
- java web项目启动即加载类
- java 汉字转拼音
- SpringMVC概要总结
- macbook下eclipse svn环境配置
- JAVA 中ArrayList如何去除重复项方法。
- java String.split()函数的用法分析
- 【Java学习笔记】I/O
- Java认证考试实例疑难辨析(10)