package warehouse;

/\*
 \*
 \* This class implements a warehouse on a Hash Table like structure, 
 \* where each entry of the table stores a priority queue. 
 \* Due to your limited space, you are unable to simply rehash to get more space. 
 \* However, you can use your priority queue structure to delete less popular items 
 \* and keep the space constant.
 \* 
 \* @author Ishaan Ivaturi
 \*/ 
public class Warehouse {
 private Sector[] sectors;
 
 // Initializes every sector to an empty sector
 public Warehouse() {
 sectors = new Sector[10];

 for (int i = 0; i < 10; i++) {
 sectors[i] = new Sector();
 }
 }
 
 /\*\*
 \* Provided method, code the parts to add their behavior
 \* @param id The id of the item to add
 \* @param name The name of the item to add
 \* @param stock The stock of the item to add
 \* @param day The day of the item to add
 \* @param demand Initial demand of the item to add
 \*/
 public void addProduct(int id, String name, int stock, int day, int demand) {
 evictIfNeeded(id);
 addToEnd(id, name, stock, day, demand);
 fixHeap(id);
 }

 /\*\*
 \* Add a new product to the end of the correct sector
 \* Requires proper use of the .add() method in the Sector class
 \* @param id The id of the item to add
 \* @param name The name of the item to add
 \* @param stock The stock of the item to add
 \* @param day The day of the item to add
 \* @param demand Initial demand of the item to add
 \*/
 private void addToEnd(int id, String name, int stock, int day, int demand) {
 // IMPLEMENT THIS METHOD
 }

 /\*\*
 \* Fix the heap structure of the sector, assuming the item was already added
 \* Requires proper use of the .swim() and .getSize() methods in the Sector class
 \* @param id The id of the item which was added
 \*/
 private void fixHeap(int id) {
 // IMPLEMENT THIS METHOD
 }

 /\*\*
 \* Delete the least popular item in the correct sector, only if its size is 5 while maintaining heap
 \* Requires proper use of the .swap(), .deleteLast(), and .sink() methods in the Sector class
 \* @param id The id of the item which is about to be added
 \*/
 private void evictIfNeeded(int id) {
 // IMPLEMENT THIS METHOD
 }

 /\*\*
 \* Update the stock of some item by some amount
 \* Requires proper use of the .getSize() and .get() methods in the Sector class
 \* Requires proper use of the .updateStock() method in the Product class
 \* @param id The id of the item to restock
 \* @param amount The amount by which to update the stock
 \*/
 public void restockProduct(int id, int amount) {
 // IMPLEMENT THIS METHOD
 }
 
 /\*\*
 \* Delete some arbitrary product while maintaining the heap structure in O(logn)
 \* Requires proper use of the .getSize(), .get(), .swap(), .deleteLast(), .sink() and/or .swim() methods
 \* Requires proper use of the .getId() method from the Product class
 \* @param id The id of the product to delete
 \*/
 public void deleteProduct(int id) {
 // IMPLEMENT THIS METHOD
 }
 
 /\*\*
 \* Simulate a purchase order for some product
 \* Requires proper use of the getSize(), sink(), get() methods in the Sector class
 \* Requires proper use of the getId(), getStock(), setLastPurchaseDay(), updateStock(), updateDemand() methods
 \* @param id The id of the purchased product
 \* @param day The current day
 \* @param amount The amount purchased
 \*/
 public void purchaseProduct(int id, int day, int amount) {
 // IMPLEMENT THIS METHOD
 }
 
 /\*\*
 \* Construct a better scheme to add a product, where empty spaces are always filled
 \* @param id The id of the item to add
 \* @param name The name of the item to add
 \* @param stock The stock of the item to add
 \* @param day The day of the item to add
 \* @param demand Initial demand of the item to add
 \*/
 public void betterAddProduct(int id, String name, int stock, int day, int demand) {
 // IMPLEMENT THIS METHOD
 }

 /\*
 \* Returns the string representation of the warehouse
 \*/
 public String toString() {
 String warehouseString = "[\n";

 for (int i = 0; i < 10; i++) {
 warehouseString += "\t" + sectors[i].toString() + "\n";
 }
 
 return warehouseString + "]";
 }

 /\*
 \* Do not remove this method, it is used by Autolab
 \*/ 
 public Sector[] getSectors () {
 return sectors;
 }
}
Complete all the methods with the comment // IMPLEMENT THIS METHOD
패키지 창고;/\* \* \* 이 클래스는 해시 테이블과 같은 구조에 웨어하우스를 구현합니다,  \* 테이블의 각 항목은 우선순위 큐를 저장합니다.  \* 공간이 제한되어 있기 때문에 단순히 리해시하여 더 많은 공간을 확보할 수는 없습니다.  \* 하지만 우선순위 큐 구조를 사용하여 덜 인기 있는 항목을 삭제하고  \* 삭제하고 공간을 일정하게 유지할 수 있습니다. \*  \* @저자 이샨 이바투리 \*/ public class Warehouse { private Sector[] 섹터;  // 모든 섹터를 빈 섹터로 초기화합니다. public Warehouse() { sectors = new Sector[10]; for (int i = 0; i < 10; i++) { sectors[i] = new Sector(); } }  /\*\* \* 제공된 메서드, 해당 동작을 추가할 부분을 코딩하세요. \* @param id 추가할 항목의 아이디입니다. \* @param name 추가할 아이템의 이름 \* @param stock 추가할 품목의 재고 \* @param day 추가할 품목의 요일 \* 추가할 품목의 초기 수요입니다. \*/ public void addProduct(int id, String name, int stock, int day, int demand) { evictIfNeeded(id); addToEnd(id, name, stock, day, demand); fixHeap(id); } /\*\* \* 올바른 섹터 끝에 새 상품 추가 \* Sector 클래스에서 .add() 메서드를 올바르게 사용해야 합니다. \* @param id 추가할 항목의 아이디입니다. \* @param name 추가할 품목의 이름입니다. \* @param stock 추가할 품목의 재고입니다. \* @param day 추가할 품목의 요일 \* 추가할 품목의 초기 수요입니다. \*/ private void addToEnd(int id, String name, int stock, int day, int demand) { // 이 메서드 구현 } /\*\* \* 항목이 이미 추가되었다고 가정하여 섹터의 힙 구조를 수정합니다. \* Sector 클래스에서 .swim() 및 .getSize() 메서드를 올바르게 사용해야 합니다. \* @param id 추가한 항목의 아이디 \*/ private void fixHeap(int id) { // 이 메서드 구현 } /\*\* \* 힙을 유지하면서 크기가 5인 경우에만 올바른 섹터에서 가장 덜 인기 있는 항목을 삭제합니다. \* Sector 클래스의 .swap(), .deleteLast(), .sink() 메서드를 적절히 사용해야 합니다. \* @param id 추가하려는 항목의 아이디입니다. \*/ private void evictIfNeeded(int id) { // 이 메서드 구현 } /\*\* \* 일부 항목의 재고를 일정량 업데이트합니다. \* Sector 클래스에서 .getSize() 및 .get() 메서드를 적절히 사용해야 합니다. \* Product 클래스에서 .updateStock() 메서드를 올바르게 사용해야 합니다. \* @param id 재입고할 품목의 아이디입니다. \* @param amount 재고를 업데이트할 금액입니다. \*/ public void restockProduct(int id, int amount) { // 이 메서드 구현 }  /\*\* \* 힙 구조를 O(logn)으로 유지하면서 임의의 제품을 삭제합니다. \* .getSize(), .get(), .swap(), .deleteLast(), .sink() 및/또는 .swim() 메서드를 적절히 사용해야 합니다. \* Product 클래스의 .getId() 메서드를 올바르게 사용해야 합니다. \* @param id 삭제할 제품의 ID \*/ public void deleteProduct(int id) { // 이 메서드 구현 }  /\*\* \* 일부 제품에 대한 구매 주문을 시뮬레이션합니다. \* Sector 클래스의 getSize(), sink(), get() 메서드를 적절히 사용해야 합니다. \* getId(), getStock(), setLastPurchaseDay(), updateStock(), updateDemand() 메서드를 올바르게 사용해야 합니다. \* @param id 구매한 제품의 아이디입니다. \* @param day 현재 날짜 \* @param amount 구매한 금액 \*/ public void purchaseProduct(int id, int day, int amount) { // 이 메서드 구현 }  /\*\* \* 빈 공간이 항상 채워지는 제품을 추가하는 더 나은 체계를 구성합니다. \* @param id 추가할 상품의 아이디입니다. \* @param name 추가할 상품의 이름입니다. \* @param stock 추가할 품목의 재고입니다. \* @param day 추가할 품목의 요일 \* 추가할 품목의 초기 수요입니다. \*/ public void betterAddProduct(int id, String name, int stock, int day, int demand) { // 이 메서드 구현 } /\* \* 창고에 대한 문자열 표현을 반환합니다. \*/ public String toString() { String warehouseString = "[\n"; for (int i = 0; i < 10; i++) { warehouseString += "\t" + sectors[i].toString() + "\n"; }  return warehouseString + "]"; } /\* \* 이 메서드는 제거하지 마세요, Autolab에서 사용합니다. \*/  public Sector[] getSectors () { 섹터를 반환합니다; }}모든 메서드에 // IMPLEMENT THIS METHOD라는 코멘트를 추가합니다.