[Java] 사용자 입력 받아서 구두 정렬 하기_Comparator

JTI·2022년 11월 22일
0

📌 Code list

목록 보기
29/55
post-thumbnail

✏️ Comparator<T> / sort() / do while / Scanner

방법1

  • Shoes객체 1개 만듬.
  • 4개의 comparator를 만듬.
  • main안에다가 반복문 구현.

import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;

class Shoes {
    private String name;
    private String date;
    private int price;
    private int goal;

    public Shoes(String name, String date, int price, int goal) {
        setDate(date);
        setGoal(goal);
        setName(name);
        setPrice(price);
    }
    @Override
    public String toString() {
        return name + "(" + date + ", " + price +"원, " + goal + "등)";
    }

    public String getName() {
        return name;
    }

    public String getDate() {
        return date;
    }

    public int getPrice() {
        return price;
    }

    public int getGoal() {
        return goal;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public void setGoal(int goal) {
        this.goal = goal;
    }
}
//1. 등록일 순
class OrderByDate implements Comparator<Shoes> {
    @Override
    public int compare(Shoes s1, Shoes s2) {
        return s1.getDate().compareTo(s2.getDate());
    }
}
//2. 높은 가격 순
class highOrderByPrice implements Comparator<Shoes> {
    @Override
    public int compare(Shoes s1, Shoes s2) {
        return (s1.getPrice() - s2.getPrice()) * -1;
    }
}
//3. 낮은 가격 순
class lowOrderByPrice implements Comparator<Shoes> {
    @Override
    public int compare(Shoes s1, Shoes s2) {
        return s1.getPrice() - s2.getPrice();
    }
}
//4. 랭킹 순
class OrderByGoal implements Comparator<Shoes> {
    @Override
    public int compare(Shoes s1, Shoes s2) {
        if(s1.getGoal() > s2.getGoal()) {
            return 1;
        } else if (s1.getGoal() < s2.getGoal()) {
            return -1;
        } else {
            return 0;
        }
    }
}

public class SortTest {
    public static void show(Shoes[] list) {
        for(Shoes shoes : list) {
            System.out.println(shoes);
        }
    }
    public static void array(Shoes[] list, Comparator<Shoes> cmp) {
        Arrays.sort(list, cmp);
        show(list);
    }

    public static void main(String[] args) {
        Shoes shoes[] = {
            new Shoes("겁나싼구두","2021-07-05",10000,3),
            new Shoes("럭셔리구두","2021-09-01",300000,5),
            new Shoes("싸구려구두","2021-10-06",20000,1),
            new Shoes("보통구두","2021-12-16",100000,4),
            new Shoes("다떨어진구두","2022-04-09",5000,2),
        };

        Scanner sc = new Scanner(System.in);
        boolean isExit = true;
        
        do {
           String info = "1. 등록일 순\n";
           info += "2. 높은 가격 순\n";
           info += "3. 낮은 가격 순\n";
           info += "4. 상품 랭킹 순\n";
           info += "5. 종료\n";
           info += "*선택하시오(1~5 이외의 번호입력 시 자동 종료됩니다.) : ";
           System.out.println(info);
           int user = sc.nextInt();
          
           if(user == 1) {
               array(shoes, new OrderByDate());
           } else if(user == 2) {
               array(shoes, new highOrderByPrice());
           } else if(user == 3) {
               array(shoes, new lowOrderByPrice());
           } else if(user == 4) {
               array(shoes, new OrderByGoal());
           } else {
               System.out.println("Good Bye~");
               isExit = false;
           }
        } while(isExit);
    }
}

방법2

  • Item객체와 Store객체 총 2개를 만듬.
  • comparator을 하나만 씀.
  • main안의 내용을 최소화.
  • 반복문을 Store객체안에 넣음.

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class Item {
    private String name;
    private String regDate;
    private int price;
    private int rank;

    public Item(String name, String regDate, int price, int rank) {
        setName(name);
        setRegDate(regDate);
        setPrice(price);
        setRank(rank);
    }
    @Override
    public String toString() {
        return name + "(" + regDate + ", " + price + "원, " + rank + "등)";
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRegDate() {
        return regDate;
    }
    public void setRegDate(String regDate) {
        this.regDate = regDate;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public int getPrice() {
        return price;
    }
    public int getRank() {
        return rank;
    }
    public void setRank(int rank) {
        this.rank = rank;
    }
}
class Store implements Comparator<Item>{
    public static final int ORDER_BY_DATE = 1;
    public static final int ORDER_BY_PRICE_DESC = 2;
    public static final int ORDER_BY_PRICE_ASE = 3;
    public static final int ORDER_BY_RANK = 4;
    public static final int EXIT = 5;
    Item[] itemList;
    int mode; // 사용자 입력 받는 숫자

    public Store(Item...itemList) {
        this.itemList = itemList;
    }
    //여기서 정렬 4개를 한꺼번에 구현
    @Override
    public int compare(Item item1, Item item2) {
        int result = 0;
        if(mode == ORDER_BY_DATE) {
            result = item1.getRegDate().compareTo(item2.getRegDate());
        } else if(mode == ORDER_BY_PRICE_DESC) {
            result = item2.getPrice() - item1.getPrice();
        } else if(mode == ORDER_BY_PRICE_ASE) {
            result = item1.getPrice() - item2.getPrice();
        } else if(mode == ORDER_BY_RANK) {
            result = item1.getRank() - item2.getRank();
        }
        return result;
    }
    public void showList() {
        Scanner sc = new Scanner(System.in);

        do {
            String info = "1. 등록일 순\n";
            info += "2. 높은 가격 순\n";
            info += "3. 낮은 가격 순\n";
            info += "4. 상품 랭킹 순\n";
            info += "5. 종료\n";
            info += "*선택하시오(1~5 이외의 번호입력 시 자동 종료됩니다.) : ";
            System.out.println(info);
            mode = sc.nextInt();

            if(mode < 1 || mode > 4) { // 1 미만이거나 4 초과면 나감
                mode = EXIT;
            }
            if(mode != EXIT) { // mode가 5가 아니면
                Arrays.sort(itemList, this); // 이 this는 comparator를 의미함.
                for(Item item : itemList) {
                    System.out.println(item);
                }
            }
        } while(mode != EXIT);
        System.out.println("Good Bye~");
    }
}

class UseStore {
    public static void main(String[] args) {
        Store store = new Store(
                new Item("럭셔리구두", "2021-09-01", 300000, 5),
                new Item("싸구려구두", "2021-10-06", 20000, 1),
                new Item("겁나싼구두", "2021-07-05", 10000, 3),
                new Item("다떨어진구두", "2022-04-09", 5000, 2),
                new Item("보통구두", "2021-12-16", 100000, 4)
        );
        store.showList();
    }
}
[결과값]
1. 등록일 순
2. 높은 가격 순
3. 낮은 가격 순
4. 상품 랭킹 순
5. 종료
*선택하시오(1~5 이외의 번호입력 시 자동 종료됩니다.) : 
1
겁나싼구두(2021-07-05, 10000원, 3등)
럭셔리구두(2021-09-01, 300000원, 5등)
싸구려구두(2021-10-06, 20000원, 1등)
보통구두(2021-12-16, 100000원, 4등)
다떨어진구두(2022-04-09, 5000원, 2등)
1. 등록일 순
2. 높은 가격 순
3. 낮은 가격 순
4. 상품 랭킹 순
5. 종료
*선택하시오(1~5 이외의 번호입력 시 자동 종료됩니다.) : 
2
럭셔리구두(2021-09-01, 300000원, 5등)
보통구두(2021-12-16, 100000원, 4등)
싸구려구두(2021-10-06, 20000원, 1등)
겁나싼구두(2021-07-05, 10000원, 3등)
다떨어진구두(2022-04-09, 5000원, 2등)
1. 등록일 순
2. 높은 가격 순
3. 낮은 가격 순
4. 상품 랭킹 순
5. 종료
*선택하시오(1~5 이외의 번호입력 시 자동 종료됩니다.) : 
4
싸구려구두(2021-10-06, 20000원, 1등)
다떨어진구두(2022-04-09, 5000원, 2등)
겁나싼구두(2021-07-05, 10000원, 3등)
보통구두(2021-12-16, 100000원, 4등)
럭셔리구두(2021-09-01, 300000원, 5등)
1. 등록일 순
2. 높은 가격 순
3. 낮은 가격 순
4. 상품 랭킹 순
5. 종료
*선택하시오(1~5 이외의 번호입력 시 자동 종료됩니다.) : 
7
Good Bye~
profile
Fill in my own colorful colors🎨

0개의 댓글