주차관리 시스템 ver.2

|
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);
//	 }
//	}





'Java' 카테고리의 다른 글

좌석 예약 시스템  (0) 2019.08.01
디버깅하는 법  (0) 2019.07.31
Java - Stream, Network  (0) 2019.07.23
객체 정렬하기  (0) 2019.07.23
Java - Stream(byte, 문자)  (0) 2019.07.22
And