No tenía nada que hacer el viernes. Basado en el artículo anterior sobre el análisis de la teoría del algoritmo de boletos 12306 (versión Java), realicé la práctica de codificación Java para que los lectores se refieran (la siguiente es una descripción simple del código relevante)
1. Herramientas de reserva de boletos
1.1 Inicializar la información de boletos de un vagón de tren
/*** Generar información de boletos ** @param Train* @return*/public static List <Ticking> initTicketList (trenes trenes) {list <trick> dulte = new ArrayList <Ticking> (); map <string, integer> asitmap = trenes. ticketType = entry.getKey (); for (int i = 0; i <ticketSize; i ++) {int salechannel = (int) (math.random () * 10) % 8; boleto = nuevo Ticket (); ticket.setsalechannel (salechannel); ticket.settickettype (tickettype); ticket.setguid (uuid.randomuuid (). ToString ()); ticket.setFromDate ( Train.getFromDate ()); ticket.setticketflag (CommonUtil.initticketFlag (trenes)); ticket.setTrainno (Train.getTrainno ()); result.add (ticket);}} regreso resultado;}1.2 Genere la compra de boletos del sitio (por ejemplo, se puede realizar el primer turno, como la primera estación 1, la segunda estación '10' y la segunda estación se devuelve en el sistema decimal)
/*** Crear* @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 = Temp.or (new BigInteger (BuidTicket (j));} temp.shiftright (1) .ToString ();}1.3 El procedimiento principal para reservar boletos, solo un boleto se reserva a la vez (a = a | b)
/*** Obtenga el número de tren correspondiente de acuerdo con las condiciones del filtro* @param ticketStr* @param ticketlist* @param condición* @return*/public static sateRoRorderByCondition (String ticketStr, list <trick> ticketlist, condición de mapas) {orden de órgano = null; para (ticket ticket: ticketlist) {bigInTeger Toticket = new BigInteger (ticketstr); Biginteger (ticket.getticketflag ()); // Si puede reservar boletos, entonces deducirá el inventario durante mucho tiempo && // (ticket.getsalechannel () == (ticket.getSalechannel () | 1)) if (Canticket (fromTicket,,, toticket) && ticket.getticketType (). Equals (condición.get ("ticketType"). toString ()) // && (ticket.getsalechannel () == (ticket.getSalechannel () | 2))) {TEMPORDER = nuevo Orden (); temporder.setOrderId (uuid.randomuuid (). ToString ()); temporder.setSeatType (ticket.getticketType ()); temporder.setticketflag (toticket.ToString ()); temporder.setTrainno (ticket.getTrainnoNo ()); Tempord er.setFromDate (ticket.getFromDate ()); temporder.setsalechannel (ticket.getsalechannel ()); temporder.setticketguid (ticket.getguid ()); ticket.setticketflag (fromTicket.or (Toticket) .Tostring ()); ruptura;}1.4 para determinar si sellar, a = ~ (~ a | b)
/*** Determine si puede reservar boletos ** @param fromTicket* @param toticket* @return*/private static boolean canticket (bigInteger fromTicket, bigInteger Toticket) {return fromTicket.equals (fromTicket.not (). O (toticket) .not ());}2. Entidad de pedido (retenga la información de pedido necesaria)
paquete com.train.ticket;/*** Entidad de pedido*@author guo_zhifeng **/public class orden {private string string string string string ticketguid; // bill idprivate string ticketflag; // compra mark private string string sattype; // asiento tipo string string string date; // Fecha privada de cadena Private String Trainno; // Entrena Número de trenes Private Intonel; 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 sattype) {this.seatType = seatType;} public String getFromDate () {return deDate;} public 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. Entidad de venta de boletos (retener la información de boletos necesaria)
paquete com.train.ticket;/*** Entidad de ticket*@author guo_zhifeng **/public class ticket {private string ticketflag; private string ticketType; private int salechannel; private string trinebra; private string guy; private string string fromDate; // Fecha de salida Public String getGuid () {Return getTrainno () {return Trainno;} public void setTrainno (String Trainno) {this.trainno = Trainno;} public String getTicketFlag () {return ticketflag;} public void setticketFlag (string ticketflag) {this.ticketflag = ticketflag; setticketType (String ticketType) {this.TicketType = ticketType;} public int getSalEcHannel () {return salechannel;} public void setsalechAnnel (int salechannel) {this.salechannel = salechannel;} public string getFomDate () {return deDate;} public setfromDate (string de string) fronDate;}}4. Información de inicialización del tren (solo información principal)
paquete com.train.ticket; import java.util.map;/*** Información sobre un tren*@author guo_zhifeng **/public class Train {private String Trainno; // Train Number int StationNum; // Número de estaciones Mapa privado <String, Integer> Seattotalnum; // Número de varios asientos String private String de String; 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 voidnum (int stationNum) StationNum;} public map <String, Integer> getSeatTotalNum () {return seattotalnum;} public void setSeatTotalNum (map <string, integer> Seattotalnum) {this.seatToTalNum = Seattotalnum;}} 5. Programa principal
5.1 Inicializar un vagón de tren
5.2 Según el formulario de compras de boletos en el sitio, la maximización es AB BC CD de EF, etc.
5.3 Salida que consumen mucho tiempo
paquete 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.ticket; import com.train.ticket.train; import com.train.util.commonutil; public class mantenente {public static void main (string [] args) {trenes trenes = new Train (); tren.settrainno ("sa"); Train.SetFromDate ("//"); trenes = new HashMap <String, Integer> (); SeatMap.put ("Business Seat",); SeatMap.put ("Primera clase",); SeatMap.put ("Segunda clase",); Train.SetSeatToTalNum (SeatMap); // Generar Ticket.Out.println ("Tickets de inicialización en el trenes") CommonUtil.initticketList (trenes); string filename = "d: //result.txt"; archivo f = nuevo archivo (nombre de archivo); if (f.exists ()) f.delete (); long starttime = system.currentTimemillis (); // int i =; // for (ticket ticket: ticketList) {// comunsutil.appendmethoda (filename, // i + "||" + comunsutil.tojson (ticket) + "/n", true); // i ++; //} system.out.println ("start booking");;; Long BegiNtime = System.CurrentTimemillis (); List <Sder> OrderResult = New ArrayList <Order> (); para (int j =; j <trenes.getStationNum () -; j ++) {String ticketStr = comunsutil.buidTicket (j); // string ticketStr = comunicación tren); OrderResult.Addall (TempListorder);} Long EndTime = System.CurrentTimemillis (); System.out.println ("Reserva completada"); // int m =; // para (Ticket Ticket: TicketList) {// String Temp = M + "||" + CommonUtil.ToJson (Ticket) + ","; // // System.out.println (temp); // CommonUtil.AppendMethoda (filename, temp, true); // m ++; //} // int k =; // para (orden de orden: ordenresult) {// TEMP = orden.geterorderid () // + "||" + orden.getsalechannel () // + "||" + orden.getFromDate () // + "||" + orden.getSeatType () // + "||" + orden.getticketguid () // + "||" + orden.gettrainno () // + "||" + orden.getticketflag () // + "||" + nuevo biginteger (orden.getticketflag ()). toString () // + "||" + k; // CommonUtil.AppendMethoda (nombre de archivo, temp, true); // k ++; //} long eedtime = system.currentTimemillis (); system.out.println ("generar orden" + orderResult.size () + "|| tiempo de contestación de tiempo:" + (endtime - begintime) + "MilliseConds"); System.out.println ("Genere el número de documentos por segundo (orden por ticket)" + new BigDecimal (OrderResult.Size ()). Multiply (new BigDecimal ()). Divide (New BigDecimal (EndTime - EXETINUTIME), BigDecimal.round_half_down); Completado ");}}6. Resultados de la operación
Lo anterior es el algoritmo de boletos de Java Code Practice 12306 presentado por el editor (ii). ¡Espero que sea útil para todos!