当前位置: 代码迷 >> Java相关 >> 5.主程序
  详细解决方案

5.主程序

热度:482   发布时间:2016-04-22 19:16:02.0
初探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;//票据id11     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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

 6.运行结果

 完整代码: 源码

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

1楼aaron_peng
12306的票可是在订票时才裂变,那可是卖出一张,裂变出几张,甚至几十张,没你想的那么简单,
Re: 全城热恋
@aaron_peng,引用12306的票可是在订票时才裂变,那可是卖出一张,裂变出几张,甚至几十张,没你想的那么简单,,这个只是在测试全列车,按照逐站扣减的,如果按照随机的同样可行。建议先看一下,第一篇的理论,请先理解后再来看看是不是这么回事?
  相关解决方案