天天看點

售票java代碼_Java代碼實踐12306售票算法(二)

周五閑來無事,基于上一篇關于淺析12306售票算法(java版)理論,進行了java編碼實踐供各位讀者參考(以下為相關代碼的簡單描述)

1.訂票工具類

1.1初始化一列車廂的票據資訊

public static List initTicketList(Train train) {

List result = new ArrayList();

Map seatMap = train.getSeatTotalNum();

for (Entry 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' 這裡傳回的十進制的)

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)

public static Order createOrderByCondition(String ticketStr,List 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)

private static boolean canTicket(BigInteger fromTicket, BigInteger toTicket) {

return fromTicket.equals(fromTicket.not().or(toTicket).not());

}

2.訂單實體(保留必要的訂單資訊)

package com.train.ticket;

public class Order {

private String orderId;

private String ticketGuid;//票據id

private String ticketFlag;//訂票标記

private String seatType;//座位類型

private String fromDate;//發車日期

private String trainNO;//列車編号

private int saleChannel;//銷售管道

public String getOrderId() {

return orderId;

}

public void setOrderId(String orderId) {

this.orderId = orderId;

}

public String getTicketGuid() {

return ticketGuid;

}

public void setTicketGuid(String ticketGuid) {

this.ticketGuid = ticketGuid;

}

public String getTicketFlag() {

return ticketFlag;

}

public void setTicketFlag(String ticketFlag) {

this.ticketFlag = ticketFlag;

}

public String getSeatType() {

return seatType;

}

public void setSeatType(String seatType) {

this.seatType = seatType;

}

public String getFromDate() {

return fromDate;

}

public void setFromDate(String fromDate) {

this.fromDate = fromDate;

}

public String getTrainNO() {

return trainNO;

}

public void setTrainNO(String trainNO) {

this.trainNO = trainNO;

}

public int getSaleChannel() {

return saleChannel;

}

public void setSaleChannel(int saleChannel) {

this.saleChannel = saleChannel;

}

}

3.票務實體(保留必要的票務資訊)

package com.train.ticket;

public class Ticket {

private String ticketFlag;

private String ticketType;

private int saleChannel;

private String trainNo;

private String guid;

private String fromDate;//發車日期

public String getGuid() {

return guid;

}

public void setGuid(String guid) {

this.guid = guid;

}

public String getTrainNo() {

return trainNo;

}

public void setTrainNo(String trainNo) {

this.trainNo = trainNo;

}

public String getTicketFlag() {

return ticketFlag;

}

public void setTicketFlag(String ticketFlag) {

this.ticketFlag = ticketFlag;

}

public String getTicketType() {

return ticketType;

}

public void setTicketType(String ticketType) {

this.ticketType = ticketType;

}

public int getSaleChannel() {

return saleChannel;

}

public void setSaleChannel(int saleChannel) {

this.saleChannel = saleChannel;

}

public String getFromDate() {

return fromDate;

}

public void setFromDate(String fromDate) {

this.fromDate = fromDate;

}

}

4.列車初始化資訊(隻進行主要資訊)

package com.train.ticket;

import java.util.Map;

public class Train {

private String trainNo;// 火車編号

private int stationNum;// 車站數量

private Map seatTotalNum;// 各種座位的數量

private String fromDate;

public String getFromDate() {

return fromDate;

}

public void setFromDate(String fromDate) {

this.fromDate = fromDate;

}

public String getTrainNo() {

return trainNo;

}

public void setTrainNo(String trainNo) {

this.trainNo = trainNo;

}

public int getStationNum() {

return stationNum;

}

public void setStationNum(int stationNum) {

this.stationNum = stationNum;

}

public Map getSeatTotalNum() {

return seatTotalNum;

}

public void setSeatTotalNum(Map seatTotalNum) {

this.seatTotalNum = seatTotalNum;

}

}

5.主程式

5.1初始化一列車廂

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

5.3輸出耗時時間

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("SA");

train.setFromDate("//");

train.setStationNum();

Map seatMap = new HashMap();

seatMap.put("商務座", );

seatMap.put("一等座", );

seatMap.put("二等座", );

train.setSeatTotalNum(seatMap);

// 生成票據

System.out.println("初始化列車中的票");

List 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 = ;

//for (Ticket ticket : ticketList) {

// CommonUtil.appendMethodA(fileName,

// i + "||" + CommonUtil.toJSON(ticket) + "\n", true);

// i++;

//}

System.out.println("開始訂票");

long beginTime = System.currentTimeMillis();

List orderResult = new ArrayList();

for (int j = ; j < train.getStationNum() - ; j++) {

String ticketStr = CommonUtil.buidTicket(j);

//String ticketStr = CommonUtil.buidTicket(,train.getStationNum());;

//System.exit();

List tempListOrder = CommonUtil.createOrderList(ticketStr,

ticketList, train);

orderResult.addAll(tempListOrder);

}

long endTime = System.currentTimeMillis();

System.out.println("訂票完成");

//int m = ;

// for (Ticket ticket : ticketList) {

// String temp = m + "||" + CommonUtil.toJSON(ticket) + ",";

// // System.out.println(temp);

// CommonUtil.appendMethodA(fileName, temp, true);

// m++;

// }

// int k = ;

// 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()

// + "||" +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()).divide(new BigDecimal(endTime - beginTime),,BigDecimal.ROUND_HALF_DOWN));

System.out.println("執行完畢");

}

}

6.運作結果

售票java代碼_Java代碼實踐12306售票算法(二)

以上所述是小編給大家介紹的Java代碼實踐12306售票算法(二),希望對大家有所幫助!