導入Java . util . comparator;
導入Java . util . hashmap;
導入Java . util . scanner;
導入Java . util . stack;
導入Java . util . vector;
導入Java . util . regex . match result;
公共類測試{
private CarStop CarStop = new CarStop(3);
專用CarTunnel tunnel = new CarTunnel();
公共無效測試(){
//存儲車輛信息,因為不是順序輸入,所以放在地圖裏。
HashMap & lt整數,Car & gtcarMap = new HashMap<。整數,Car & gt();
//進入車庫的最早時間和離開車庫的最晚時間。
int startTime,endTime
startTime =整數。MAX _ VALUE
endTime =整數。最小值;
Scanner scanner =新掃描儀(system . in);
//(“A”或“d”或“E”,int,int)
while(scanner . has next(" \ \((A | D | E),(\\d+),(\ \ D+)\ \)"){
scanner.next("\\((A|D|E),(\\d+),(\ \ D+)\ \)");
match result r = scanner . match();
車車;
//如果輸入壹個,
if (r.group(1)。equalsIgnoreCase(" A "){
//車已經錄好了。
if (carMap.keySet()。包含(integer . parse int(r . group(2))){
//拿出來設置到達時間
car = carmap . get(integer . parse int(r . group(2)));
car . arrive = integer . parse int(r . group(3));
}否則{
//否則,記錄汽車。
car =新車(Integer.parseInt(r.group(2))、integer . parse int(r . group(3)));
carMap.put(car.no,car);
}
如果(car.arrive & ltstart time)start time = car . arrive;
if(car . leave & gt;end time)end time = car . leave;
//出站時間和到達時間被視為相同。
}else if (r.group(1)。equalsIgnoreCase(" D "){
if (carMap.keySet()。包含(integer . parse int(r . group(2))){
car = carmap . get(integer . parse int(r . group(2)));
car . leave = integer . parse int(r . group(3));
}否則{
car =新車(Integer.parseInt(r.group(2)),0,integer . parse int(r . group(3)));
carMap.put(car.no,car);
}
如果(car.arrive & ltstart time)start time = car . arrive;
if(car . leave & gt;end time)end time = car . leave;
}else if (r.group(1)。equalsIgnoreCase(" E "){
打破;
}
}
//將記錄的汽車做成數組,排序。
Car[] cars =新車[carmap . size()];
cars = carMap.values()。toArray(汽車);
Arrays.sort(cars,新的比較器& ltCar & gt(){
//排序順序是到達時間>;發行時間>牌照
公共int比較(汽車c1,汽車c2) {
if (c1 .到達!=c2.arrive)返回c 1 . arrive-C2 . arrive;
if (c1 .離開!=c2.leave)返回c 1 . leave-C2 . leave;
返回c 1 . no-C2 . no;
}
});
for(int time = start time;時間& lt=結束時間;time++){
system . out . println(" TIME:"+TIME);
for(int k = 0;k & lt汽車.長度;k++){
car car = cars[k];
//如果壹輛車還沒進停車場,就已經到出站時間了。
if(car . leave = = time & amp;& ampis full()& amp;& amp!carStop.contains(汽車)){
for(int I = tunnel . size()-1;我& gt=0;我- ){
car c = tunnel . get(I);
if (c.equals(car)){
for(int j = I+1;j & lttunnel . size();j++){
System.out.println(car+"為“+car+”讓路,重新進入等候區);
}
tunnel.remove(汽車);
System.out.println(car+“不進停車場就走”);
}否則{
System.out.println(car+"為“+car+”)讓路;
}
}
}否則{
//如果現在有車到了。
if (car.arrive == time){
//停車場不滿意
如果(!carStop.isFull()) {
//進入停車場
carStop.push(汽車);
//開始充電
car.chargeStart = time
System.out.println(car+"進入停車場開始收費");
}否則{
//停車場滿了,等等。
System.out.println(car+"到達等候區等候");
tunnel.push(汽車);
}
}
}
}
//處理停止中的汽車
//不包括汽車同時離開的情況
//按照後進先出的順序尋找任何離開的汽車。
for(int k = carstop . size()-1;k & gt=0;k - ){
car car = carstop . elementat(k);
//準備離開
if (car.leave == time){
Car otherCar
//所有跟在他後面進來的車都準備讓路。
while ((otherCar = carStop.pop())!=汽車){
//進入等候區的最前面。
tunnel.unshift(其他汽車);
System.out.println(otherCar+"準備為“+car+”讓路);
}
for(int m = tunnel . size()-1;m & gt=0;m - ){
系統。out.println(隧道。elementat (m)+“為“+car+”讓路;
}
System.out.println(otherCar+"離開,停車時間:"+(其他車。離開-另壹輛車。charge start));
for(int m = 0;m & lttunnel . size();m++){
系統。out.println(隧道。elementat (m)+“讓路後,重新進入等候區”);
}
汽車候車;
//停車場有空位,等待序列中前面的車入庫。
而(!is full()& amp;& amp(waitingCar = tunnel.shift())!=null ){
carStop.push(等待car);
//停止計時開始
if(waiting car . charge start = =-1){
System.out.println(waitingCar+"停車時間改為"+時間);
waiting car . charge start = time;
}
System.out.println(waitingCar+"進入停車場");
}
}
}
}
}
公共靜態void main(String[] args){
新測試()。test();
}
}
@SuppressWarnings("serial ")
類CarTunnel擴展了Vector & ltCar & gt{
公共汽車隧道()
super();
}
公共汽車班次(){
if (size() == 0)返回null
return remove(0);
}
公共void unshift(汽車汽車){
super.add(0,汽車);
}
公共空推(車車){
super.add(汽車);
}
公共汽車pop(){
if (size() == 0)返回null
返回remove(size()-1);
}
}
@SuppressWarnings("serial ")
類CarStop擴展堆棧& ltCar & gt{
私有int大小;
公共停車場(整數型){
this.size = size
}
public boolean isFull(){
return size()= = size;
}
公共汽車pop(){
返回super . pop();
}
公共汽車推(汽車車){
if(size()& lt;= size){
return super.push(汽車);
}否則{
返回null
}
}
}
汽車等級{
公共int號;
public int到達;
公共假期;
public int charge start =-1;
公共汽車(整數,整數時間,整數超時){
this.no = no
this.arrive = timeIn
this.leave = timeOut
}
公共汽車(整數,整數時間){
這個(不,timeIn,-1);
}
公共字符串toString(){
返回String.format("Car(%d)",no);
}
}
結果:
(壹,631)
(第5條第30款)
(第4條第20款)
(壹,316)
(壹,215)
(壹,1,10)
(D,1.50)
(第二條第三十款)
(3,31)
(第4條第25款)
(第五章第三十二節)
(第六章第四十節)
(E,0,0)
時間:10
汽車(1)進入停車場,開始收費。
時間:11
時間:12
時間:13
時間:14
時間:15
汽車(2)進入停車場並開始充電。
時間:16
汽車(3)進入停車場並開始充電。
時間:17
時間:18
時間:19
時間:20
轎廂(4)到達並在等候區等候。
時間:21
時間:22
時間:23
時間:24
時間:25
汽車(4)沒有進入停車場就離開了。
時間:26
時間:27
時間:28
時間:29
時間:30
汽車(5)到達並在等候區等候。
汽車(3)準備為汽車(2)讓路
汽車(5)為汽車(2)讓路
汽車(3)為汽車(2)讓路
汽車(2)出發,停車時間:15
轎廂(3)讓路並重新進入等候區。
轎廂(5)讓路並重新進入等候區。
汽車(3)進入停車場
汽車(5)停車時間改為:30。
汽車(5)進入停車場
時間:31
汽車(6)到達並在等候區等候。
汽車(5)準備為汽車(3)讓路
汽車(6)為汽車(3)讓路
汽車(5)為汽車(3)讓路
汽車(3)出發,停車時間:15
轎廂(5)讓路並重新進入等候區。
轎廂(6)讓路並重新進入等候區。
汽車(5)進入停車場
汽車(6)停車時間修改為:31。
汽車(6)進入停車場
時間:32
汽車(6)準備為汽車(5)讓路
汽車(6)為汽車(5)讓路
汽車(5)出發,停車時間:2
轎廂(6)讓路並重新進入等候區。
汽車(6)進入停車場
時間:33
時間:34
時間:35分鐘
時間:36
時間:37
時間:38
時間:39
時間:40
汽車(6)出發,停車時間:9
時間:41
時間:42
時間:43
時間:44
時間:45分鐘
時間:46
時間:47
時間:48
時間:49
時間:50
汽車(1)離開,停車時間:40。