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);
}
}
}
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);
}
}
오늘은 예외처리 강의를 들었는데 마침 지금 진행 중인 개인과제의 키오스크가 InputMismatchException을 다뤄보기 좋은 예제라 내가 짠 키오스크 코드로 예외처리에 도전해 봤다. 익셉션을 캐치하는 것까지는 잘 됐는데 catch 블락을 빠져나가면 프로그램을 그냥 끝내지 말고 다시 처음부터 실행시키고 싶어서 continue를 했더니 메인페이지에서 입력값은 안 받고 무한 루프되는 오류가 생겼다..
근데 마침 자바의 정석 8-7 연습문제가 이와 비슷한 케이스라 이걸로 먼저 연습해 보고 다시 도전해 봐야겠다.
연습문제 8-7
1~100 사이의 숫자를 맞추는 프로그램을 작성하시오. 예외처리를 해서 숫자가 아닌 값을 입력했을 때는 다시 입력을 받도록 하시오.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int answer = (int) (Math.random() * 100) + 1;
int input = 0;
int count = 0;
do {
count++;
System.out.println("1과 100 사이의 값을 입력하세요 : ");
// input = new Scanner(System.in).nextInt();
try {
Scanner sc = new Scanner(System.in);
input = sc.nextInt();
} catch (Exception e) {
System.out.println("숫자를 입력해주세요.");
continue;
}
if (answer > input) {
System.out.println("더 큰 수를 입력하세요.");
} else if (answer < input) {
System.out.println("더 작은 수를 입력하세요.");
} else {
System.out.println("맞췄습니다.");
System.out.println("시도 횟수는 " + count + "번입니다.");
break;
}
} while (true);
}
}
// 깊은 복사 메서드
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 2. Arrays.copyOf() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
}
}
Collection
List
리스트는 크기가 가변적으로 늘어나는 동적배열이다.
ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언과 동시에 생성 크기 지정x
intList.add(99);
intList.add(50);
intList.add(12); // 값이 추가되면서 크기가 늘어난다.
System.out.println(intList.get(1));
intList.set(1, 77); // 값을 수정
System.out.println(intList.get(1));
ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언과 동시에 생성
intList.add(99);
intList.add(50);
intList.add(12);
System.out.println(intList.get(0));
intList.remove(0);
System.out.println(intList.get(0));
결과 : 99
50 // remove로 값을 제거하면 뒤에 있던 값들이 앞으로 땡겨진다.
Stack
값을 수직으로 쌓아놓고 넣었다가 빼서 조회하는 형식으로 데이터를 관리하는 자료형
LIFO “나중에 들어간 것이 가장 먼저 나온다(Last-In-First-out)”
Stack<Integer> intStack = new Stack<>();
intStack.push(29);
intStack.push(7);
intStack.push(1004); // 값을 넣어줌
while (!intStack.isEmpty()){
System.out.println(intStack.pop()); // 맨 위에 값을 꺼낸다.
}
// 결과 :
1004
7
29
Set
순서가 없고 자료의 중복을 허용하지 않는 집합으로 생성자가 없어 생성자가 존재하는 HashSet 클래스를 이용해서 생성한다.
선언 : Set<Integer> intSet
생성 : new HashSet<Integer>()
추가 : intSet.add({추가할 값})
조회 : intSet.get({조회 할 순번})
삭제 : intSet.remove({삭제할 값})
포함확인 : intSet.contains({포함확인 할 값}) - 해당값이 포함되어 있는지 boolean 값으로 응답
Map
key-value 구조로 key값은 중복을 허용하지 않는다.
선언 : Map<String, Integer> intMap
생성 : new HashMap<>()
추가 : intMap.put({추가할 Key값},{추가할 Value값})
조회 : intMap.get({조회할 Key값})
전체 key 조회 : intMap.keySet() - Map의 모든 Key를 모아서 Set 자료형으로 리턴
전체 value 조회 : intMap.values() - Map의 모든 Value를 모아 Set 자료형으로 리턴
삭제 : intMap.remove({삭제할 Key값})
연습
자료구조 요리 레시피 메모장 만들기
입력값
저장할 자료구조명을 입력합니다. (List / Set / Map)
내가 좋아하는 요리 제목을 먼저 입력합니다.
이어서 내가 좋아하는 요리 레시피를 한 문장씩 입력합니다.
입력을 마쳤으면 마지막에 “끝” 문자를 입력합니다.
출력값
입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 먼저 출력해줍니다.
이어서, 입력한 모든 문장 앞에 번호를 붙여서 입력 순서에 맞게 모두 출력해줍니다.
내가 작성한 코드 일부
switch (type) {
case "List" :
boolean flag = true;
ArrayList<String> recipeArr = new ArrayList<>();
while (flag) {
String recipe = sc.nextLine();
recipeArr.add(recipe);
if(recipe.equals("끝")) {
flag = false;
}
}
System.out.println("[ " + type + "으로 저장된 " + title + " ]");
for(String item : recipeArr) {
System.out.println(item);
}
break;
정답 코드 일부
switch (collectionName) {
case "List":
ArrayList<String> strList = new ArrayList<>();
while (true) {
// 한줄씩 입력받아서 strList 에 저장
String text = sc.next();
if (Objects.equals(text, "끝")) {
break;
}
strList.add(text);
}
title = "[ List로 저장된 " + title + " ]"; // [ 제목 ]
System.out.println(title);
// strList 한줄씩 출력
for (int i = 0; i < strList.size(); i++) {
int number = i + 1;
System.out.println(number + ". " + strList.get(i));
}
break;
알게 된 점
"끝"을 입력받았을 때 boolean 변수를 false로 바꿔서 while문을 빠져나왔는데 정답코드를 보니 그냥 간단하게 break를 쓰면 됐었다. 아직 break가 익숙지 않아서 이런 차이가 생긴 것 같다.
처음에 레시피를 next()로 받았더니 레시피를 한 줄 단위가 아닌 단어로 받아와서 nextLine()으로 수정했다. 공백을 포함한 한 줄을 온전히 받으려면 nextLine 메서드를 써야겠다.