您的位置:首页 > 编程语言 > Java开发

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

2016-02-19 20:40 841 查看
周五闲来无事,基于上一篇关于初探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.订单实体(保留必要的订单信息)

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: