package Week03.day0724;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
public class practice0724 {
public static void main(String[] args) throws ParseException {
// java.util.Date 쓰는 법
// SimpleDateFormat f = new SimpleDateFormat("MM-dd HH:mm")
// f.parse("07-01 15:30")
SimpleDateFormat f = new SimpleDateFormat("MM-dd HH:mm");
ParkingLotAdm pla = new ParkingLotAdm(f.parse("07-01 06:00"), f.parse("07-31 24:00"), 5);
// "HH:mm:ss"
Car cr1 = new Car("22나7077", f.parse("07-01 06:00"), f.parse("07-01 06:30"), 500, f.parse("07-01 06:00"));
Car cr2 = new Car("22나7078", f.parse("07-01 06:10"), f.parse("07-01 06:50"), 500, f.parse("07-01 06:00"));
Car cr3 = new Car("22나7079", f.parse("07-01 06:20"), f.parse("07-01 07:30"), 500, f.parse("07-01 06:00"));
Car cr4 = new Car("22나7070", f.parse("07-01 06:30"), f.parse("07-01 08:30"), 500, f.parse("07-01 06:00"));
Car cr5 = new Car("22나7071", f.parse("07-01 06:40"), f.parse("07-01 10:30"), 500, f.parse("07-01 06:00"));
pla.addCar(cr1);
pla.addCar(cr2);
pla.addCar(cr3);
pla.addCar(cr4);
pla.addCar(cr5);
ArrayList al = new ArrayList();
// pla.carSort(Car car);
pla.outCar(cr1);
pla.outCar(cr2);
pla.outCar(cr3);
}
}
class ParkingLotAdm{
private Date startDt; // 주차장이 언제 열고 닫는지
private Date endDt;
private final int maxCarsu = 3; // 최대 수용자동차수
private HashSet cars = new HashSet(); // 주차된 차들s
private HashMap outCars = new HashMap(); // 나간 차들
private ArrayList waitCars = new ArrayList(); // 대기중인 차들
public ParkingLotAdm(Date startDt, Date endDt, int maxCarsu) {
this.startDt = startDt;
this.endDt = endDt;
}
public void addCar(Car car) { // 주차하는 차를 추가한다
if(this.cars.size()< maxCarsu) {
// Iterator it = this.cars.iterator(); // ★★★★★★★★★★★★★★★★★★★★★ this. !!!!!
// while(it.hasNext()) {
// Car e = (Car) it.next();
this.cars.add(car);
System.out.println("입고된 차량 번호 :" + car.getCarNo() + ", 입차시간 : " + car.getInDt());
}else {
waitCars.add(car);
System.out.println("대기중인 차량 번호 :" + car.getCarNo() + ", 대기시간 : " + car.getWaitStrDt());
}
}
public void outCar(Car car) throws ParseException {
// 나가는 차를 제거하면 outCars에 추가하고 주차비용을 리턴한다
// + 출차시간 업데이트
// 주차비용은 30분당 500원 이다
// 주차대기중인 차가 있으면 주차시킨다(주차대기중인 차는 대기순서에 따라 주차됨.)
// add된 순서대로 들어감.
//나가는차 제거
this.cars.remove(car);
//outCars에 추가 + 출차시간 업데이트
this.outCars.put(car.getCarNo(), car.getOutDt());
System.out.println("출차차량번호 : " + car.getCarNo() + ", 출차시간 : " + car.getOutDt());
Car.calTimeGap(car);
//주차비용 계산(Date)
// SimpleDateFormat transFormat = new SimpleDateFormat("HH:mm:ss");
// String st_inDt = transFormat.format(car.getInDt());
// String st_outDt = transFormat.format(car.getOutDt());
// int new_inDt = Integer.parseInt(st_inDt);
// int new_outDt = Integer.parseInt(st_outDt);
//주차비용 계산(String으로)
// int new_inDt = Integer.parseInt(car.getInDt());
// int new_outDt = Integer.parseInt(car.getOutDt());
// int hourDiff = new_outDt / 100 - new_inDt / 100; //시간의 차이
// int minDiff = new_outDt % 100 - new_inDt % 100; // 분의 차이를 계산한다.
// // 총 분의 시간을 계산하고 30분당 500원으로 계산한 후 출력한다.
// int totDiff = hourDiff * 60 + minDiff;
// int rateStd = 500;
// int rate = totDiff / 30 * rateStd;
}
public void carSort(Car car, Comparator c) {
// 파라미터로 전달한 정렬기준에 따라 주차차량을 Sort한다
Collections.sort((List)car, c);
System.out.println(car);
}
// public int compare(Car c1, Car c2) {
// if (c1.getInDt() < c2.getInDt()) {
// return -1;
// } else if (Integer.parseInt(c1.getInDt()) > Integer.parseInt(c2.getInDt())) {
// return 1;
// }
// return 0;
// }
//Comparator 방법 적용
// 첫 번째 파라미터로 넘어온 객체 < 두 번째 파라미터로 넘어온 객체: 음수 리턴
// 첫 번째 파라미터로 넘어온 객체 == 두 번째 파라미터로 넘어온 객체: 0 리턴
// 첫 번째 파라미터로 넘어온 객체 > 두 번째 파라미터로 넘어온 객체: 양수 리턴
// 음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 변경된다.
}
class Car {
private String carNo; //차량번호
private Date inDt; // 입차시간
private Date outDt; // 출차시간
private int fee; // 수수료
private Date waitStrDt; // 대기시작시간
public Car(String carNo, Date inDt, Date outDt, int fee, Date waitStrDt) {
this.carNo = carNo;
this.inDt = inDt;
this.outDt = outDt;
this.fee = fee;
this.waitStrDt = waitStrDt;
}
public String getCarNo() {
return carNo;
}
public void setCarNo(String carNo) {
this.carNo = carNo;
}
public Date getInDt() {
return inDt;
}
public void setInDt(Date inDt) {
this.inDt = inDt;
}
public Date getOutDt() {
return outDt;
}
public void setOutDt(Date outDt) {
this.outDt = outDt;
}
public int getFee() {
return fee;
}
public void setFee(int fee) {
this.fee = fee;
}
public Date getWaitStrDt() {
return waitStrDt;
}
public void setWaitStrDt(Date waitStrDt) {
this.waitStrDt = waitStrDt;
}
public int hashCode() {
return Objects.hash(carNo);
}
public boolean equals(Object obj) {
if (obj != null && obj instanceof Car) { // obj가 Car의 Instance
return carNo.equals(((Car) obj).carNo); // 값이 같은지 비교
} else {
return false;
}
}
public static void calTimeGap(Car car) throws ParseException {
long diff = car.getOutDt().getTime() - car.getInDt().getTime();
long hour = diff / (1000*60*30); // 1000: 초로 만듬 , 60:시간으로 만듬, 30: 분으로 만듬.
long rate = 500 * (int)hour;
System.out.println("총 주차요금은 " + rate + "원입니다.");
}
}
//시간계산 유틸.
//class Utils{
// public static int calTimeGap(Date carIndt) throws ParseException {
// Date now = new Date(); // 현재시간
// long diff = now.getTime() - carIndt.getTime();
// long hour = diff / (1000*60*60);
//
// return (int)hour;
// }
//
// public static Date getDate(int year, int month, int date, int hour, int minute, int second) {
// Calendar cal = Calendar.getInstance();
// cal.set(year, month-1, date, hour, minute, second);
// cal.set(Calendar.MILLISECOND, 0);
// return cal.getTime();
// }
//
// public static String getDate(Date date) {
// SimpleDateFormat format1 = new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss");
// return format1.format(date);
// }
// }