你的位置:首页 > 软件开发 > Java > 初探12306售票算法(二)

初探12306售票算法(二)

发布时间:2016-02-19 21:00:06
1.订票工具类 1 package com.train.util; 2 3 import java.io.BufferedWriter; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 imp ...

1.订票工具类

初探12306售票算法(二)初探12306售票算法(二)
 1 package com.train.util; 2  3 import java.io.BufferedWriter; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.OutputStreamWriter; 7 import java.math.BigInteger; 8 import java.util.ArrayList; 9 import java.util.HashMap; 10 import java.util.List; 11 import java.util.Map; 12 import java.util.Map.Entry; 13 import java.util.UUID; 14  15 import com.train.ticket.Order; 16 import com.train.ticket.Ticket; 17 import com.train.ticket.Train; 18  19 public class CommonUtil { 20 //  /** 21 //   * 将对象转换为JSON字符串 22 //   *  23 //   * @param ob 24 //   * @return 25 //   */ 26 //  public static String toJSON(Object ob) { 27 //    try { 28 //      return JSONMarshaler.marshalObject(ob).toJSON(); 29 //    } catch (JSONMarshalerException e) { 30 //      return ""; 31 //    } 32 //  } 33  34   /** 35    * 生成Ticket信息 36    *  37    * @param train 38    * @return 39   */ 40   public static List<Ticket> initTicketList(Train train) { 41     List<Ticket> result = new ArrayList<Ticket>(); 42     Map<String, Integer> seatMap = train.getSeatTotalNum(); 43     for (Entry<String, Integer> entry : seatMap.entrySet()) { 44       int ticketSize = entry.getValue(); 45       String ticketType = entry.getKey(); 46       for (int i = 0; i < ticketSize; i++) { 47         int saleChannel = (int) (Math.random() * 10) % 8; 48         Ticket ticket = new Ticket(); 49         ticket.setSaleChannel(saleChannel); 50         ticket.setTicketType(ticketType); 51         ticket.setGuid(UUID.randomUUID().toString()); 52         ticket.setFromDate(train.getFromDate()); 53         ticket.setTicketFlag(CommonUtil.initTicketFlag(train)); 54         ticket.setTrainNo(train.getTrainNo()); 55         result.add(ticket); 56       } 57  58     } 59  60     return result; 61   } 62  63   /** 64    * 初始化票标记 65    *  66    * @param train 67    * @return 68   */ 69   public static String initTicketFlag(Train train) { 70     int stationNum = train.getStationNum(); 71     return new BigInteger("1").shiftLeft(stationNum - 1).toString(); 72   } 73  74   /** 75    * 生成购票站点 76    *  77    * @param j 78    * @return 79   */ 80   public static String buidTicket(int j) { 81     return new BigInteger("1").shiftLeft(j).toString(); 82   } 83  84   /** 85    * A方法追加文件:使用RandomAccessFile 86    * @param fileName 87    * @param content 88    * @param isConsule 89   */ 90   public static void appendMethodA(String fileName, String content, boolean isConsule) { 91      92     try (OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(fileName,true),"UTF-8");BufferedWriter bw = new BufferedWriter(out);){ 93       if(isConsule){ 94         System.out.println(content); 95         return; 96       } 97       bw.write(content); 98       bw.newLine(); 99       bw.flush();100       101     } catch (IOException e) {102       e.printStackTrace();103     }104   }105   /**106    * 107    * @param ticketStr108    * @param ticketList109    * @param train110    * @return111   */112   public static Map<String, Integer> getSeatLeftByticket(String ticketStr,113       List<Ticket> ticketList, Train train) {114     return null;115   }116   /**117    * 预订票票核心118    * 119    * @param ticketStr120    * @param ticketList121    * @param train122    * @return123   */124   public static List<Order> createOrderList(String ticketStr,125       List<Ticket> ticketList, Train train) {126     List<Order> tempListOrder = new ArrayList<Order>();127     Map<String, Integer> seatMap = train.getSeatTotalNum();128     for (Entry<String, Integer> entry : seatMap.entrySet()) {129       String ticketType = entry.getKey();130       Map p = new HashMap();131       p.put("ticketType", ticketType);132       boolean continues = true;133       int i= 0;134       while(continues){135         Order result = createOrderByCondition(ticketStr,ticketList,p);136         if(result!=null){137           tempListOrder.add(result);138           i++;139         } else {140           continues = false;141         }142         143       }144       //System.out.println("i"+i);145       146       147 148     }149     return tempListOrder;150   }151   /**152    * 根据筛选条件取得对应的车次153    * @param ticketStr154    * @param ticketList155    * @param condition156    * @return157   */158   159   public static Order createOrderByCondition(String ticketStr,List<Ticket> ticketList,Map condition){160     Order tempOrder = null;161     for (Ticket ticket : ticketList) {162 163       BigInteger toTicket = new BigInteger(ticketStr);164       BigInteger fromTicket = new BigInteger(ticket.getTicketFlag());165       // 如果可以订票,那么久进行扣除库存&&166       // (ticket.getSaleChannel()==(ticket.getSaleChannel()|1))167       if (canTicket(fromTicket, toTicket)168           &&ticket.getTicketType().equals(condition.get("ticketType").toString())169           //&&(ticket.getSaleChannel()==(ticket.getSaleChannel()|2))170           ) {171         tempOrder = new Order();172         tempOrder.setOrderId(UUID.randomUUID().toString());173         tempOrder.setSeatType(ticket.getTicketType());174         tempOrder.setTicketFlag(toTicket.toString());175         tempOrder.setTrainNO(ticket.getTrainNo());176         tempOrder.setFromDate(ticket.getFromDate());177         tempOrder.setSaleChannel(ticket.getSaleChannel());178         tempOrder.setTicketGuid(ticket.getGuid());179         ticket.setTicketFlag(fromTicket.or(toTicket).toString());180        break;181       } 182     }183     184     return tempOrder;185   }186 187   /**188    * 订票判断是否可以订票189    * 190    * @param fromTicket191    * @param toTicket192    * @return193   */194   private static boolean canTicket(BigInteger fromTicket, BigInteger toTicket) {195     return fromTicket.equals(fromTicket.not().or(toTicket).not());196   }197  /**198   * 创建199   * @param i200   * @param stationNum201   * @return202   */203   public static String buidTicket(int i, int stationNum) {204     BigInteger temp = new BigInteger("0");205     for (int j = i; j < stationNum; j++) {206       temp = temp.or(new BigInteger(buidTicket(j)));207     }208     return temp.shiftRight(1).toString();209   }210 }

原标题:初探12306售票算法(二)

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录