java 作业8 一堆比较器和clone的应用
package com.jf;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.*;
import static com.jf.Product.comparedate;
class Product implements Comparable<Product>{
String id="",name;
double price;
int num;//库存
Date date;
public void setNum(int num){
this.num=num;
}
public int getNum() {
return num;
}
public void setDate(Date date) {
this.date = date;
}
public Date getDate(){
return date;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setId(String id){
this.id=id;
}
public String getId() {
return id;
}
public void setPrice(double price){
this.price=price;
}
public double getPrice() {
return price;
}
public static class compareprice implements Comparator<Product> {//根据价格比较
public int compare(Product a,Product b){
if(a.price>b.price) return 1;
else if(a.price==b.price) return 0;
return -1;
}
}
public static class comparename implements Comparator<Product>{
public int compare(Product a,Product b){
return a.name.compareTo(b.id);
}
}
public static Comparator<Product> comparedate = (Product o1, Product o2) -> o1.date.compareTo(o2.date);
public Product(){
}
public Product(String id,String name,double price,Date date){//含参构造
this.id=id;
this.name=name;
this.price=price;
this.date=date;
}
public int compareTo(Product t){//继承接口重写排序规则
return id.compareTo(t.id);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;//如果地址相同 直接一样
if (o == null || getClass() != o.getClass()) return false;//为空或者类的类型不同
Product pro=(Product) o;
return Objects.equals(id, pro.id) &&//比较三个值 对应hashcode
Objects.equals(name, pro.name)&& Objects.equals(price, pro.price);
}
public int hashCode() {//重写 比较三个值 id和name和price相等 返回相同的hash码
return Objects.hash(id, name,price);
}
public Product clone() throws CloneNotSupportedException {//抛异常 否则用try-catch
Product clone=(Product) super.clone();//
Date date =(Date)this.date.clone();//深克隆 由于date是引用形变量 先克隆一个date给clone 再返回clone
clone.setDate(new Date());
return clone;
}
}
abstract class comparenum implements Comparator<Product> {//匿名内部类 用abstract可以不用实现
public abstract int compare(Product o1, Product o2);
}
public class Main {
public static void main(String[] args)throws CloneNotSupportedException {
Scanner sc=new Scanner(System.in);
Product []product=new Product[1000];
for(int i=0;i<1000;i++) product[i]=new Product();
System.out.println("请输入您要添加的产品个数");
int n=sc.nextInt();
//添加
for(int cnt=0;cnt<n;cnt++){
System.out.println("请输入您要添加的产品编号");
String s="";
s=sc.next();
int flag=0;
for(int i=0;i<cnt;i++){
if(product[i].id.equals(s)){
System.out.println("请输入您要增加的数量");
int need=sc.nextInt();
int x=product[i].num;
product[i].setNum(x+need);
flag=1;
break;
}
}
if(flag==0){
System.out.println("产品不存在,请输入新产品的:名称、价格、数量");
String name=sc.next();
double price=sc.nextDouble();
int num=sc.nextInt();
product[cnt].setId(s);
product[cnt].setName(name);
product[cnt].setPrice(price);
product[cnt].setNum(num);
product[cnt].setDate(new Date());
}
}
//销售
int flag=0;
System.out.println("请输入您要销售的产品编号");
String s=sc.next();
for(int i=0;i<n;i++){
if(product[i].id.equals(s)){
System.out.println("请输入您要销售的数量");
int need=sc.nextInt();
int x=product[i].num;
if(need>x) System.out.println("库存数量不存");
else product[i].setNum(x-need);
flag=1;
break;
}
}
if(flag==0){
System.out.println("产品编号输入错误");
}
//产品查询
System.out.println("请输入您要的查询方式");
System.out.println("输入1按编号排序 2按名称排序 3按价格排序 4按库存数量排序 5按上架日期排序");
int op=sc.nextInt();
if(op==1) Arrays.sort(product,0,n);//id的比较 重载comparable
if(op==2) Arrays.sort(product,0,n,new Product.comparename());
if(op==3) Arrays.sort(product,0,n,new Product.compareprice());//内部类的sort
if(op==4) Arrays.sort(product, 0, n, new comparenum() {//匿名内部类的sort 需要重新写 刚刚是abstract
@Override
public int compare(Product o1, Product o2) {
return o1.num-o2.num;
}
});
if(op==5) Arrays.sort(product,0,n,comparedate);//lambda的sort
System.out.println("编号 名称 价格 库存数量 库存金额 上架日期");
for(int i=0;i<n;i++){
System.out.printf("%s %s %.3f %d %.3f ",product[i].id,product[i].name,product[i].price,product[i].num,product[i].price*product[i].num);
System.out.println(product[i].date);
}
//产品统计
int sum=0;
double pricesum=0;
for(int i=0;i<n;i++){
sum+=product[i].num;
pricesum+=product[i].price;
}
System.out.printf("总库存数量为%d\n",sum);
System.out.printf("总库存金额为%.3f\n",pricesum);
}
}