1. compareTo() 메서드를 오버라이딩 해준다. 최신순(내림차순)으로 정렬하기 위해 리턴 값에 -1을 곱해줬다.

public class CompletedOrder extends Order implements Comparable<CompletedOrder> {
    String completiontime;

    CompletedOrder(){
    }

    CompletedOrder(Order order){
        super(order.orderNum, order.orderList, order.totalPrice, order.time, order.request);
        this.completiontime = getTime();
    }

    @Override
    public String toString() {
        return "\n1. 대기번호 : " + this.orderNum + "\n2. 주문 상품 목록 : " + this.orderList +"\n3. 주문 총 가격 : " + this.totalPrice + "W\n4. 요청사항 : " + this.request + "\n5. 주문 일시 : " + this.time + "\n6. 완료 주문 일시 : " +this.completiontime+ "\n";
    }

    @Override
    public int compareTo(CompletedOrder o) {
        return this.completiontime.compareTo(o.completiontime) * -1; // 최신순 정렬
    }
}

 

2. sort 메서드로 정렬해 준다. 이때 정렬 기준에 오버라이딩한 compareTo를 넣어준다.

    public void printRecentOrder(){
        System.out.println("[ 최근 완료된 주문 ]");
        
        Collections.sort(completedOrders, CompletedOrder::compareTo); // 주문 완료 처리된 순서대로 정렬

        int SIZE = completedOrders.size();
        if(SIZE >= 3){
            for (int i = 0; i <3; i++){
                System.out.println(completedOrders.get(i));
            }
        } else {
            for (CompletedOrder o : completedOrders){
                System.out.println(o);
            }
        }
    }

 

'TIL > WEEK4' 카테고리의 다른 글

팀 과제 키오스크 관리 프로젝트  (0) 2023.06.07

지난번 개인 과제 키오스크에서 기능을 추가하는 팀 프로젝트를 진행했다.

 

과제에서 요구한 추가 기능은 다음과 같다.

손님이 주문할 때 요청사항을 적는 기능

  • (개선) 주문 화면

         주문 시 요청사항 메시지를 입력할 수 있습니다. (20자 제한)

  • (신규) 주문 현황

          맨 위에 완료된 최근주문 3개를 출력한다.

          그 아래에 대기 중인 모든 주문 목록을 출력한다.

 

 

가게 주인이 주문 현황과 메뉴 목록을 추가, 삭제할 수 있도록 하는 기능

          0. 메인 메뉴

    • 메인 메뉴에서 아래 기능을 실행한다.
      • “1. 대기주문 목록”
      • “2. 완료주문 목록”
      • “3. 상품 생성”
      • “4. 상품 삭제”
    1. 대기주문 목록
    • 주문이 완료되어 처리 대기 중인 주문을 조회하고 완료처리 할 수 있다.
    • 주문 데이터 형식은 아래와 같다.
      1. 대기 번호
      2. 주문 상품 목록
      3. 주문 총 가격
      4. 요청 사항
      5. 주문 일시
      6. 날짜는 ISO 8601 형식으로 조합된 UTC 날짜 및 시간 예) 2016-10-27T 17:13:40+00:00

            2. 완료 주문 목록

      • 완료처리 했던 주문들을 모두 조회할 수 있다.
      • **[ 완료주문 데이터 ]**는 **[ 주문 데이터 ]**에 완료 일시를 추가로 가진다.
      • [ 완료주문 데이터 ]
        1. 대기 번호
        2. 주문 상품 목록
        3. 주문 총 가격
        4. 주문 일시
        5. 요청 사항
        6. 완료주문 일시
        7. 날짜는 ISO 8601 형식으로 조합된 UTC 날짜 및 시간 예) 2016-10-27T 17:13:40+00:00

               3. 상품 생성

      • 새로운 상품정보(메뉴, 이름, 설명, 가격)를 입력하여 생성할 수 있다.
      • 기존에 없는 메뉴라면 신규로 생성해 준다.
      • 새로 생성된 메뉴와 상품은 각각 유일한 메뉴 ID, 상품 ID 식별자를 가진다.

                4. 상품 삭제

      • 상품 ID를 가지고 기존 상품정보를 삭제할 수 있다.
      • 삭제이전에 주문된 주문정보에서는 삭제되지 않는다.

 

 

 

 

 

대기주문 목록을 담을 Order 클래스

인스턴스를 생성할 때 자동으로 주문일시(time)에 현재 시각을 넣을 수 있게 매개변수로 time을 받지 않는 생성자를 만들어줬다.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Order {
    int orderNum;
    String orderList;
    String time;
    double totalPrice;
    String request;

    Order(){}
    Order(int orderNum, String orderList, double totalPrice, String time, String request){
        this.orderNum = orderNum;
        this.orderList = orderList;
        this.totalPrice = totalPrice;
        this.time = time;
        this.request = request;
    }

    Order(int orderNum, String orderList, double totalPrice, String request){
        this.orderNum = orderNum;
        this.orderList = orderList;
        this.totalPrice = totalPrice;
        this.request = request;
        this.time = getTime();
    }

    public String getTime() {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        return now.format(dateTimeFormatter);
    }

    @Override
    public String toString() {
        return "\n1. 대기번호 : " + this.orderNum + "\n2. 주문 상품 목록 : " + this.orderList +"\n3. 주문 총 가격 : " + this.totalPrice +"W\n4. 요청사항 : " + this.request + "\n5. 주문 일시 : " + this.time + "\n";
    }

}

 

 

 

주문 시 요청사항(request)을 손님에게 입력받은 뒤 장바구니(cart)에 담겨 있는 상품명들을 문자열로 연결해서(orderlist) 대기주문 목록(orders)에 넣어줬다. 주문번호와 총가격은 기존 프로젝트에 이미 있어서 그대로 가져왔다.

    private List<Item> cart;
    private List<Order> orders;
    
    
    public void addToWaiting(List<Item> cart){
        Scanner sc = new Scanner(System.in);
        System.out.println("요청 사항을 입력해주세요.");
        String request = sc.nextLine();

        String orderList = "";
        for(Item a : cart){
            orderList += a.name + ", ";
        }
        orderList = orderList.substring(0, orderList.length() - 2); // 맨 끝 , 제거
        orders.add(new Order(orderNumber, orderList, totalPrice, request));

    }

 

 

 

완료 주문 데이터는 대기 주문 데이터를 상속받아 주문 완료 일시(completiontime) 변수를 추가해 줬다. 또 완료 주문 목록을 최신순으로 정렬하기 위해 주문 완료 일시(completiontime)를 기준으로 비교하도록 compareTo를 오버라이딩 해줬다.

public class CompletedOrder extends Order implements Comparable<CompletedOrder> {
    String completiontime;

    CompletedOrder(){
    }

    CompletedOrder(Order order){
        super(order.orderNum, order.orderList, order.totalPrice, order.time, order.request);
        this.completiontime = getTime();
    }

    @Override
    public String toString() {
        return "\n1. 완료번호 : " + this.orderNum + "\n2. 주문 상품 목록 : " + this.orderList +"\n3. 주문 총 가격 : " + this.totalPrice + "W\n4. 요청사항 : " + this.request + "\n5. 주문 일시 : " + this.time + "\n6. 완료 주문 일시 : " +this.completiontime+ "\n";
    }
    @Override
    public int compareTo(CompletedOrder order) {
        return this.time.compareTo(order.completiontime);
    }


}

 

 

 

관리자가 완료처리할 대기주문 번호(idx)를 고르면 선택한 주문 데이터(co)를 완료 주문 리스트(completedOrders)에 추가하고 대기주문 목록(orders)에서 삭제했다.

    public void CompletedOrder(int idx){
        Order co = getOrder(idx);
        orders.remove(idx);
        completedOrders.add(new CompletedOrder(co));
    }

 

 

 

완료된 최근주문 3개를 출력하도록 내림차순으로 정렬한 뒤, 완료 주문 목록의 크기가 3 이상이면 세 개만 출력되게 하고 그 미만이면 전부 출력되게 했다.

private List<CompletedOrder> completedOrders;


public void printRecentOrder(){
        completedOrders.sort(Collections.reverseOrder());
        int SIZE = completedOrders.size();
        if(SIZE >= 3){
            for (int i = 0; i <3; i++){
                System.out.println(completedOrders.get(i));
            }
        } else {
            for (CompletedOrder o : completedOrders){
                System.out.println(o);
            }
        }
    }

 

 

 

그 아래 대기 중인 주문 모두를 출력하는 메서드는 다음과 같이 작성했다.

    public void printWaiting() {
        int SIZE = orders.size();
        System.out.println("\n대기주문 "+SIZE+"개\n");
        for (Order order : orders){
            System.out.println(order);
        }
    }

 

'TIL > WEEK4' 카테고리의 다른 글

객체 내 시간 요소 순으로 정렬하기  (0) 2023.06.08

+ Recent posts