✏️ 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;
}
}
class OrderByDate implements Comparator<Shoes> {
@Override
public int compare(Shoes s1, Shoes s2) {
return s1.getDate().compareTo(s2.getDate());
}
}
class highOrderByPrice implements Comparator<Shoes> {
@Override
public int compare(Shoes s1, Shoes s2) {
return (s1.getPrice() - s2.getPrice()) * -1;
}
}
class lowOrderByPrice implements Comparator<Shoes> {
@Override
public int compare(Shoes s1, Shoes s2) {
return s1.getPrice() - s2.getPrice();
}
}
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;
}
@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) {
mode = EXIT;
}
if(mode != EXIT) {
Arrays.sort(itemList, this);
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~