迷你共享单车——面向对象版
前言:本项目是在记录自己在尚马学习独立完成的第一个项目的笔记。
目的是学习面向对象当中如何使用参数,以及方法怎么使用比较简单。
记录自己的思路与老师思路的差别之处,学习比较,欢迎大佬指正。
项目描述:
实现一个迷你单车的管理器,实现单车的增删改查功能,具体有1.投放单车、2.查看单车、3.删除单车、4.借出单车、5.归还单车、6.借出次数排序。每个模块的具体功能不再赘述,主要考察的是对增删改查的使用。
自己的实现:
本人的思路是,创建test文件来完成人机的交互,company文件来完成公司相关车辆的调动使用,另外两个文件就是公司对象与单车对象。
SharedBike文件:
import java.util.Date;
public class SharedBike {
private int bid; //单车编号
private String bname; //单车名称
private int status; //单车状态 0.已借出 1.可借出
private Date borrowTime; //车辆借出时间
private Date returnTime;
public SharedBike() {
}
public SharedBike(int bid, String bname, int status, Date borrowTime, Date returnTime) {
this.bid = bid;
this.bname = bname;
this.status = status;
this.borrowTime = borrowTime;
this.returnTime = returnTime;
}
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Date getBorrowTime() {
return borrowTime;
}
public void setBorrowTime(Date borrowTime) {
this.borrowTime = borrowTime;
}
public Date getReturnTime() {
return returnTime;
}
public void setReturnTime(Date returnTime) {
this.returnTime = returnTime;
}
}
SharedBikeCompany文件:
public class SharedBikeCompany {
private int bikeCompanyId; //公司id
private String name; //公司名称
private SharedBike[] sharedBikes; //公司持有的共享单车
private int sum; //公司单车数量
private int count; //公司借车次数
public SharedBikeCompany() {
}
public SharedBikeCompany(int bikeCompanyId, String name, SharedBike[] sharedBikes, int sum, int count) {
this.bikeCompanyId = bikeCompanyId;
this.name = name;
this.sharedBikes = sharedBikes;
this.sum = sum;
this.count = count;
}
public int getBikeCompanyId() {
return bikeCompanyId;
}
public void setBikeCompanyId(int bikeCompanyId) {
this.bikeCompanyId = bikeCompanyId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public SharedBike[] getSharedBikes() {
return sharedBikes;
}
public void setSharedBikes(SharedBike[] sharedBikes) {
this.sharedBikes = sharedBikes;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
company文件:
该文件是我自己设计系统的主要文件,主要完成了人机交互界面方法的具体实现。
具体方法解析:
1.createBike(): 该方法完成的是三个公司的创建,以及三个公司当中自行车的创建,默认每个公司当中已经有3辆自行车。
2.showBike(): 该方法里面完成了 对车辆的展示,以及当空间不足的时间对数组空间的扩容。为什么扩容和打印写在这个里面,因为先写的这个是我写的第一个方法,本人就写上了。
3.addBike(): 该方法主要完成了对车辆的添加功能,本人的想法是直接进行sum值的修改,然后通过showBike()方法将新添加的数组给具体化,本方法的不足是需要频繁的扩充数组,造成资源的浪费。
4.deleteBike(): 该方法使用双指针的解法,根据单车的ID来修改车辆的名字,主要是数组的覆盖,使用下一个覆盖这个名字。
5.returnBike(),borrowBike() : 这两个方法就是对Data类的使用,相比上面的比较简单。
import java.util.Arrays;
import java.util.Date;
public class Company {
//创建公司
static void newCompany(SharedBikeCompany sbcom1, SharedBikeCompany sbcom2, SharedBikeCompany sbcom3) {
//创建三个公司
SharedBikeCompany[] sharedBikeCompanies = new SharedBikeCompany[3];
//创建公司对应的车辆
createBike(sharedBikeCompanies, sbcom1, sbcom2, sbcom3);
}
public static void showBike(SharedBike[] sharedBike, SharedBikeCompany sbcom1) {
if (sharedBike.length < sbcom1.getSum()) {
SharedBike[] sharedBikes = new SharedBike[sbcom1.getSum()];
//System.out.println(sbcom1.getSum());
sharedBikes = Arrays.copyOf(sharedBike,sbcom1.getSum());
for (int j = sharedBike.length; j < sbcom1.getSum(); j++) {
SharedBike sb = new SharedBike();
sharedBikes[j] = sb;
sb.setBid((j + 1));
sb.setBname(sbcom1.getName() + (j + 1));
sb.setStatus(1);
}
sbcom1.setSharedBikes(sharedBikes);
}
//
//if (sharedBike.equals(sbcom1.getSharedBikes())){
for (int i = 0; i < sbcom1.getSum(); i++) {
if (sbcom1.getSharedBikes()[i].getStatus() == 1) {
System.out.println(sbcom1.getSharedBikes()[i].getBid() + " " + sbcom1.getSharedBikes()[i].getBname() + " " + "可借");
} else {
System.out.println(sbcom1.getSharedBikes()[i].getBid() + " " + sbcom1.getSharedBikes()[i].getBname() + " 已借出 " + sbcom1.getSharedBikes()[i].getBorrowTime());
}
}
//}
}
static void createBike(SharedBikeCompany[] sharedBikeCompanies, SharedBikeCompany sbcom1, SharedBikeCompany sbcom2, SharedBikeCompany sbcom3) {
sharedBikeCompanies[0] = sbcom1;
sharedBikeCompanies[1] = sbcom2;
sharedBikeCompanies[2] = sbcom3;
sharedBikeCompanies[0].setName("ofo单车");
sharedBikeCompanies[0].setBikeCompanyId(1);
sharedBikeCompanies[0].setSum(3);
sharedBikeCompanies[0].setCount(100);
sharedBikeCompanies[1].setName("halo单车");
sharedBikeCompanies[1].setBikeCompanyId(2);
sharedBikeCompanies[1].setSum(3);
sharedBikeCompanies[1].setCount(200);
sharedBikeCompanies[2].setName("摩拜 单车");
sharedBikeCompanies[2].setBikeCompanyId(3);
sharedBikeCompanies[2].setSum(3);
sharedBikeCompanies[2].setCount(150);
//创建三个公司对应的自行车
for (int i = 0; i < sharedBikeCompanies.length; i++) {
SharedBike[] sb_arrays = new SharedBike[sharedBikeCompanies[0].getSum()];
for (int j = 0; j < sb_arrays.length; j++) {
SharedBike sb = new SharedBike();
sb_arrays[j] = sb;
sb.setBid(j + 1);
sb.setBname(sharedBikeCompanies[i].getName() + (j + 1));
sb.setStatus(1);
}
sharedBikeCompanies[i].setSharedBikes(sb_arrays);
}
}
public static void addBike(int num, int newSum, SharedBikeCompany sbcom1, SharedBikeCompany sbcom2, SharedBikeCompany sbcom3) {
if (num == 1) {
if (newSum > (sbcom1.getSum() - 3)) {
System.out.println("空间不足,已经参照配置进行扩容");
sbcom1.setSum((sbcom1.getSum() + newSum));
System.out.println("已经按照比例投放完毕");
} else {
System.out.println("添加成功");
}
}
if (num == 2) {
if (newSum > (sbcom2.getSum() - 3)) {
System.out.println("空间不足,已经参照配置进行扩容");
sbcom2.setSum((sbcom2.getSum() + newSum));
System.out.println("已经按照比例投放完毕");
} else {
System.out.println("添加成功");
}
}
if (num == 3) {
if (newSum > (sbcom3.getSum() - 3)) {
System.out.println("空间不足,已经参照配置进行扩容");
sbcom3.setSum((sbcom3.getSum() + newSum));
System.out.println("已经按照比例投放完毕");
} else {
System.out.println("添加成功");
}
}
}
public static void deleteBike(int num2,SharedBike[] sharedBike,SharedBikeCompany sbcom1) {
//双指针删除序号,让名字前进一个,序号不变。最后打印的时间少打印一个。
int l =0;
int r =0;
while (r < sbcom1.getSum()){
if (sharedBike[l].getBid() == num2 && num2 <= sbcom1.getSum()){
r++;
sharedBike[l].setBname(sharedBike[r].getBname());
}
sharedBike[l].setBname(sharedBike[r].getBname());
l++;
r++;
}
sbcom1.setSum(sbcom1.getSum()-1);
}
public static void borrowBike(int number,SharedBike[] sharedBike,SharedBikeCompany sbcom1){
for(int i=0;i<sharedBike.length;i++){
if (sharedBike[i].getBid() == number){
sharedBike[i].setStatus(0);
sharedBike[i].setBorrowTime(new Date());
sbcom1.setCount(sbcom1.getCount() +1);
}
}
}
public static void returnBike(int choice_num3, SharedBike[] sharedBikes, SharedBikeCompany sbcom1) {
for(int i=0;i<sharedBikes.length;i++){
if (sharedBikes[i].getBid() == choice_num3){
sharedBikes[i].setStatus(1);
sharedBikes[i].setReturnTime(new Date());
System.out.println("你的还车时间是"+sharedBikes[i].getReturnTime());
System.out.println("你的借车时间是:"+ sharedBikes[i].getBorrowTime());
System.out.println("用车时间是"+(sharedBikes[i].getReturnTime().getTime() - sharedBikes[i].getBorrowTime().getTime())+"毫秒");
System.out.println("计费标准是1毫秒1分钱");
System.out.println("收取你"+(sharedBikes[i].getReturnTime().getTime() - sharedBikes[i].getBorrowTime().getTime())/100+"元");
}
}
}
}
Test文件
笔者在该模块完成的是人机的交互。
Begin()方法: 是开始。
putBike(): 是调用上面文件当中的addBike的方法。
该文件中的方法主要是完成人机界面的交互,通过这里的方法来调用Company文件当中的方法。
rankBike(): 该方法使用冒泡排序来完成对这三个公司车辆的排序,不严谨,需要我们重新创建一个新的公司数组来存储公司,不然会因为你排序之和,原来公司的顺序别破坏。
import org.w3c.dom.ls.LSOutput;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("欢迎使用迷你共享单车系统");
int num;
//sbcom1.setSharedBikes(new SharedBike[3]);
start(sc);
}
private static void start(Scanner sc) {
int num;
SharedBikeCompany sbcom1 = new SharedBikeCompany();
SharedBikeCompany sbcom2 = new SharedBikeCompany();
SharedBikeCompany sbcom3 = new SharedBikeCompany();
SharedBikeCompany [] arrays= new SharedBikeCompany[3];
arrays[0] = sbcom1;
arrays[1] = sbcom2;
arrays[2] = sbcom3;
sbcom1.setSharedBikes(new SharedBike[3]);
Company.newCompany(sbcom1,sbcom2,sbcom3);//创建三个公司
do {
Begin();
System.out.println("请选择");
int choose = sc.nextInt();
switch (choose){
case 1:
System.out.println("1.投放Bike");
putBike(sbcom1,sbcom2,sbcom3);
break;
case 2:
System.out.println("2.查看Bike");
checkBike(sbcom1,sbcom2,sbcom3);
break;
case 3:
System.out.println("3.删除Bike");
deleteBike(sbcom1,sbcom2,sbcom3);
break;
case 4:
System.out.println(" 4.借出Bike");
borrowBike(sbcom1,sbcom2,sbcom3);
break;
case 5:
System.out.println("5.归还Bike");
returnBike(sbcom1,sbcom2,sbcom3);
break;
case 6:
System.out.println("Bike排行榜");
rankBike(arrays);
break;
case 7:
System.exit(0);
default:
System.out.println("输入错误,请返回后重新输入");
}
System.out.println("输入0返回");
num = sc.nextInt();
}while (num ==0);
}
public static void Begin(){
System.out.println("*********************************************************************************************");
System.out.println(" 1.投放Bike");
System.out.println(" 2.查看Bike");
System.out.println(" 3.删除Bike");
System.out.println(" 4.借出Bike");
System.out.println(" 5.归还Bike");
System.out.println(" 6.Bike排行榜");
System.out.println(" 7.退出");
System.out.println("*********************************************************************************************");
}
public static void putBike(SharedBikeCompany sbcom1,SharedBikeCompany sbcom2,SharedBikeCompany sbcom3) {
System.out.println("1.ofo单车");
System.out.println("2.halo单车");
System.out.println("3.摩拜单车");
System.out.println("请你输入要投入的品牌1-3");
Scanner sc = new Scanner(System.in);
int num =sc.nextInt();
System.out.println("输入你要投放的数量");
int newSum = sc.nextInt();
Company.addBike(num,newSum,sbcom1,sbcom2,sbcom3);
}
public static void checkBike(SharedBikeCompany sbcom1,SharedBikeCompany sbcom2,SharedBikeCompany sbcom3) {
System.out.println("♦----------------------------------------------------------------♦");
System.out.println("| 公司序号 | 公司名称 | 公司单车数量 | 公司单车借出的数量");
System.out.println("♦----------------------------------------------------------------♦");
System.out.println("|"+" "+sbcom1.getBikeCompanyId()+" | "+sbcom1.getName()+" | "+sbcom1.getSum()+" | "+sbcom1.getCount() +" |");
System.out.println("单车序号 单车品牌 单车状态 借出时间");
Company.showBike(sbcom1.getSharedBikes(),sbcom1);
System.out.println("♦----------------------------------------------------------------♦");
System.out.println("| 公司序号 | 公司名称 | 公司单车数量 | 公司单车借出的数量");
System.out.println("♦----------------------------------------------------------------♦");
System.out.println("|"+" "+sbcom2.getBikeCompanyId()+" | "+sbcom2.getName()+" | "+sbcom2.getSum()+" | "+sbcom2.getCount() +" |");
System.out.println("单车序号 单车品牌 单车状态 借出时间");
Company.showBike(sbcom2.getSharedBikes(),sbcom2);
System.out.println("♦----------------------------------------------------------------♦");
System.out.println("| 公司序号 | 公司名称 | 公司单车数量 | 公司单车借出的数量");
System.out.println("♦----------------------------------------------------------------♦");
System.out.println("|"+" "+sbcom3.getBikeCompanyId()+" | "+sbcom3.getName()+" | "+sbcom3.getSum()+" | "+sbcom3.getCount() +" |");
System.out.println("单车序号 单车品牌 单车状态 借出时间");
Company.showBike(sbcom3.getSharedBikes(),sbcom3);
}
public static void deleteBike(SharedBikeCompany sbcom1,SharedBikeCompany sbcom2,SharedBikeCompany sbcom3) {
System.out.println("1.ofo单车");
System.out.println("2.halo单车");
System.out.println("3.摩拜单车");
System.out.println("请你输入要删除的品牌1-3");
Scanner sc = new Scanner(System.in);
int num =sc.nextInt();
if (num ==1){
System.out.println("此"+sbcom1.getName()+"如下");
System.out.println("单车序号 单车品牌 单车状态 借出时间");
Company.showBike(sbcom1.getSharedBikes(),sbcom1);
}else if (num ==2){
System.out.println("此"+sbcom2.getName()+"如下");
System.out.println("单车序号 单车品牌 单车状态 借出时间");
Company.showBike(sbcom2.getSharedBikes(),sbcom2);
}else if(num ==3){
System.out.println("此"+sbcom3.getName()+"如下");
System.out.println("单车序号 单车品牌 单车状态 借出时间");
Company.showBike(sbcom3.getSharedBikes(),sbcom3);
}else {
System.out.println("输入错误");
}
switch (num){
case 1:
System.out.println("输入要删除的序号");
int delete_num = sc.nextInt();
Company.deleteBike(delete_num,sbcom1.getSharedBikes(),sbcom1);
break;
case 2:
System.out.println("输入要删除的序号");
int delete_num2 = sc.nextInt();
Company.deleteBike(delete_num2,sbcom2.getSharedBikes(),sbcom2);
break;
case 3:
System.out.println("输入要删除的序号");
int delete_num3 = sc.nextInt();
Company.deleteBike(delete_num3,sbcom2.getSharedBikes(),sbcom3);
break;
default:
System.out.println("输入错误");
break;
}
System.out.println("删除结束");
}
public static void borrowBike(SharedBikeCompany sbcom1,SharedBikeCompany sbcom2,SharedBikeCompany sbcom3) {
System.out.println("1.ofo单车");
System.out.println("2.halo单车");
System.out.println("3.摩拜单车");
System.out.println("请你输入要操作的品牌1-3");
Scanner sc = new Scanner(System.in);
int num =sc.nextInt();
if (num ==1){
System.out.println("此"+sbcom1.getName()+"如下");
System.out.println("单车序号 单车品牌 单车状态 借出时间");
Company.showBike(sbcom1.getSharedBikes(),sbcom1);
}else if (num ==2){
System.out.println("此"+sbcom2.getName()+"如下");
System.out.println("单车序号 单车品牌 单车状态 借出时间");
Company.showBike(sbcom2.getSharedBikes(),sbcom2);
}else {
System.out.println("此"+sbcom3.getName()+"如下");
System.out.println("单车序号 单车品牌 单车状态 借出时间");
Company.showBike(sbcom3.getSharedBikes(),sbcom3);
}
switch (num){
case 1:
System.out.println("输入要借车的序号");
int choice_num = sc.nextInt();
Company.borrowBike(choice_num,sbcom1.getSharedBikes(),sbcom1);
break;
case 2:
System.out.println("输入要借车的序号");
int choice_num2 = sc.nextInt();
Company.borrowBike(choice_num2,sbcom2.getSharedBikes(),sbcom2);
break;
case 3:
System.out.println("输入要借车的序号");
int choice_num3 = sc.nextInt();
Company.borrowBike(choice_num3,sbcom2.getSharedBikes(),sbcom3);
break;
default:
System.out.println("输入错误");
break;
}
System.out.println("借车结束");
}
public static void returnBike(SharedBikeCompany sbcom1,SharedBikeCompany sbcom2,SharedBikeCompany sbcom3) {
System.out.println("1.ofo单车");
System.out.println("2.halo单车");
System.out.println("3.摩拜单车");
System.out.println("请你输入要操作的品牌1-3");
Scanner sc = new Scanner(System.in);
int num =sc.nextInt();
switch (num){
case 1:
System.out.println("输入要还车的序号");
int choice_num = sc.nextInt();
Company.returnBike(choice_num,sbcom1.getSharedBikes(),sbcom1);
break;
case 2:
System.out.println("输入要还车的序号");
int choice_num2 = sc.nextInt();
Company.returnBike(choice_num2,sbcom2.getSharedBikes(),sbcom2);
break;
case 3:
System.out.println("输入要还车的序号");
int choice_num3 = sc.nextInt();
Company.returnBike(choice_num3,sbcom2.getSharedBikes(),sbcom3);
break;
default:
System.out.println("输入错误");
break;
}
System.out.println("还车结束");
}
public static void rankBike(SharedBikeCompany [] arrays) {
for(int i=0 ;i<2;i++){
for (int j =i+1 ;j<3;j++){
if (arrays[i].getCount() > arrays[j].getCount()){
SharedBikeCompany temp = arrays[i];
arrays[i] = arrays[j];
arrays[j] = temp;
}
}
}
System.out.println("公司名称 借车次数");
for (int i=2;i>=0;i--) {
System.out.println(arrays[i].getName() + " "+arrays[i].getCount());
}
}
}
个人方法的总结:
本人自己实现的方法代码的冗余程度比较高,而且每个方法的传递参数过多,容易造成思路的混乱,需要改进。
老师的实现:
老师的代码思路清晰,代码冗余较少,且每个文件都有自己需要实现的功能,不需要那么多参数的传递。
ShareBikeInter 接口
该接口将车辆的增删改查抽象。为以后大项目的开发减少冗余度。
//面向接口编程 更高的抽象层
//接口 更像 一个角色(具备的功能)
public interface ShareBikeInter {
/**
* 添加单车 投放
*
* @param num :投放的数量
*/
//对单车的增删改查
void addBike(int num);
/**
* 查询所有单车
*
* @return :返回的是一个数组
*/
ShareBike[] queryAll();
/**
* 根据id查询指定的单车
*
* @param bikeId
* @return
*/
ShareBike queryById(int bikeId);
/**
* 根据单车id 借车
*
* @param bikeId
*/
void borrowBike(int bikeId);
/**
* 换车
*
* @param bikeId
*/
void backBike(int bikeId);
/**
* 根据单车id删除某辆车
*
* @param bikeId
*/
void deleteBike(int bikeId);
}
ShareBike文件:
文件主要是对bike对象的实现,因为车辆的操作是在公司的基础上去创建的,所以该文件当中不要实现对应的方法。
import java.util.Date;
public class ShareBike {
//单车id: 唯一标识符 不可重复的 和人的身份证号码id类似
private int id;
//1:可以借出 0:已经借出了
private int status;
// 单车被借出的时间
private Date borrowTime;
public ShareBike() {
}
public ShareBike(int id, int status, Date borrowTime) {
this.id = id;
this.status = status;
this.borrowTime = borrowTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Date getBorrowTime() {
return borrowTime;
}
public void setBorrowTime(Date borrowTime) {
this.borrowTime = borrowTime;
}
}
ShareBikeCompany文件
该文件是具体的方法的实现界面,实现了接口,重写接口当中的方法。
addBike(): 方法实现了车辆的投放功能,传入的参数是添加的数目,难点是数组长度的判断,已经数组的扩容,扩容一般扩大一点,不能像我自己写的方法一样每次投放都需要扩容。
deleteBike(): 该方法实现了车辆的删除,与我的思路不同的是,老师根据车辆id直接修改了整个数组当中车辆的值,而我只是将数组中的名字前移了,个人感觉我的方法更好一些。
borrowBike(),backBike(): 根据传入的参数来修改车辆的状态。
import java.util.Arrays;
import java.util.Date;
public abstract class ShareBikeCompany implements ShareBikeInter {
private int id;
private String name;
//公司拥有的单车 12
private ShareBike[] shareBikes;
//sum: 公司实际拥有的单车数量
private int sum;
//单车被借出 的次数
private int count;
//用来生成单车id的
private int bikeIndex = 1;
public ShareBikeCompany(int id, String name, ShareBike[] shareBikes, int sum, int count) {
this.id = id;
this.name = name;
this.shareBikes = shareBikes;
this.sum = sum;
this.count = count;
}
public ShareBikeCompany() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ShareBike[] getShareBikes() {
return shareBikes;
}
public void setShareBikes(ShareBike[] shareBikes) {
this.shareBikes = shareBikes;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
/**
* 难点: 数组是否需要扩容
*
* @param num
*/
@Override
public void addBike(int num) {
//数组是否需要扩容
if (sum + num > shareBikes.length) {
//shareBikes指向更大的数组
shareBikes = Arrays.copyOf(shareBikes, (shareBikes.length + num) * 2);
System.out.println("扩容后的新数组的长度是 " + shareBikes.length);
}
for (int i = 0; i < num; i++) {
//单车的id 是不可重复的值 一直自增
shareBikes[sum++] = new ShareBike(bikeIndex++, 1, null);
}
System.out.println("投放成功");
}
@Override
public ShareBike[] queryAll() {
return shareBikes;
}
@Override
public ShareBike queryById(int bikeId) {
return null;
}
@Override
public void deleteBike(int bikeId) {
//找到这辆车
for (int i = 0; i < sum; i++) {
ShareBike shareBike = shareBikes[i];
if (bikeId == shareBike.getId()) {
//进行后面的元素的依次向前移动
for (int j = i; j < sum-1; j++) {
shareBikes[j] = shareBikes[j + 1];
}
sum--;
//最后一个元素设置为null
shareBikes[sum] = null;
System.out.println("删除成功了");
return;
}
}
System.out.println("没有此id所对应的单车 " + bikeId);
}
@Override
public void borrowBike(int bikeId) {
//单车对象的成员变量的值 找到这辆车
for (int i = 0; i < sum; i++) {
ShareBike shareBike = shareBikes[i];
//找到此id所对应的单车对象 了
if (bikeId == shareBike.getId()) {
// 判断这个车的状态 是否可借
if (shareBike.getStatus() == 1) {
shareBike.setStatus(0);
shareBike.setBorrowTime(new Date());
//return只要一执行 表示方法执行完毕 在void中 return;
System.out.println("单车借出成功了");
//单车借出次数自增
count++;
return;
} else {
System.out.println("此车已经被借出 不能重复借" + bikeId);
return;
}
}
}
System.out.println("没有此id所对应的单车 " + bikeId);
}
@Override
public void backBike(int bikeId) {
//单车对象的成员变量的值 找到这辆车
for (int i = 0; i < sum; i++) {
ShareBike shareBike = shareBikes[i];
//找到此id所对应的单车对象 了
if (bikeId == shareBike.getId()) {
// 判断这个车的状态 是否可借
if (shareBike.getStatus() == 0) {
//计算借出时长
Date borrowDate = shareBike.getBorrowTime();
Date backDate = new Date();
long last = backDate.getTime() - borrowDate.getTime();
System.out.println(" 借出时长 S " + (last / 1000));
System.out.println(" 需要支付金额: " + (last / 1000) * 0.1);
//单车对象的状态值归位
shareBike.setStatus(1);
shareBike.setBorrowTime(null);
//return只要一执行 表示方法执行完毕 在void中 return;
System.out.println("单车归还成功了");
return;
} else {
System.out.println("此车尚未借出 无需归还" + bikeId);
return;
}
}
}
System.out.println("没有此id所对应的单车 " + bikeId);
}
}
ShareBikeMgr文件
该文件主要实现的是人机的交互功能。
chaKan(): 该方法主要是查看,因为不需要修改或者删除,直接在该方法当中就能实现车辆的查看。
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
//管理器的主要功能:和用户进行交互 接收用户的输入值 给用户反馈信息
public class ShareBikeMgr {
private ShareBikeCompany[] shareBikeCompanies = new ShareBikeCompany[3];
public void initial() {
//向上转型
shareBikeCompanies[0] = new OfoCompany(1001, "Ofo", new ShareBike[3], 0, 0);
shareBikeCompanies[1] = new HaloCompany(1002, "Halo", new ShareBike[3], 0, 0);
shareBikeCompanies[2] = new MoBikeCompany(1003, "MoBike", new ShareBike[3], 0, 0);
}
/**
* 菜单项打印
*/
public void menu() {
initial();
Scanner sc = new Scanner(System.in);
String answer;
do {
System.out.println("****欢迎进入单车管理系统***");
System.out.println(" 1 投放单车");
System.out.println(" 2 查看单车");
System.out.println(" 3 删除单车");
System.out.println(" 4 借出单车");
System.out.println(" 5 归还单车");
System.out.println(" 6 排行榜");
System.out.println("**********************");
System.out.println("请输入: ");
int num = sc.nextInt();
switch (num) {
case 1:
touFang(sc);
break;
case 2:
chaKan(sc);
break;
case 3:
shanChe(sc);
break;
case 4:
jieChe(sc);
break;
case 5:
huanChe(sc);
break;
case 6:
rank();
break;
default:
System.out.println(" 1- 6");
break;
}
System.out.println("是否继续 Y/N");
answer = sc.next();
} while ("y".equals(answer));
System.out.println("程序结束了");
}
private void rank() {
ShareBikeCompany[] tmpArr = Arrays.copyOf(this.shareBikeCompanies, shareBikeCompanies.length);
Arrays.sort(tmpArr, new Comparator<ShareBikeCompany>() {
@Override
public int compare(ShareBikeCompany o1, ShareBikeCompany o2) {
return o2.getCount() - o1.getCount();
}
});
//
for (int i = 0; i < tmpArr.length; i++) {
System.out.println(tmpArr[i].getName() + " " + tmpArr[i].getCount());
}
}
private void shanChe(Scanner sc) {
System.out.println(" 1 Ofo");
System.out.println(" 2 Halo");
System.out.println(" 3 MoBike");
System.out.println("请选择公司 : ");
int companyNum = sc.nextInt();
System.out.println("请录入待删除的单车id ");
int bikeId = sc.nextInt();
if (companyNum == 1 || companyNum == 2 || companyNum == 3) {
shareBikeCompanies[companyNum - 1].deleteBike(bikeId);
} else {
System.out.println(" 1- 3 ");
}
}
private void huanChe(Scanner sc) {
System.out.println(" 1 Ofo");
System.out.println(" 2 Halo");
System.out.println(" 3 MoBike");
System.out.println("请选择公司 : ");
int companyNum = sc.nextInt();
System.out.println("请录入待归还的单车id ");
int bikeId = sc.nextInt();
if (companyNum == 1 || companyNum == 2 || companyNum == 3) {
shareBikeCompanies[companyNum - 1].backBike(bikeId);
} else {
System.out.println(" 1- 3 ");
}
}
private void jieChe(Scanner sc) {
System.out.println(" 1 Ofo");
System.out.println(" 2 Halo");
System.out.println(" 3 MoBike");
System.out.println("请选择公司 : ");
int companyNum = sc.nextInt();
System.out.println("请录入待借的单车id ");
int bikeId = sc.nextInt();
if (companyNum == 1 || companyNum == 2 || companyNum == 3) {
shareBikeCompanies[companyNum - 1].borrowBike(bikeId);
} else {
System.out.println(" 1- 3 ");
}
/* switch (companyNum) {
case 1:
//
shareBikeCompanies[0].borrowBike(bikeId);
break;
case 2:
//
shareBikeCompanies[1].borrowBike(bikeId);
break;
case 3:
//
shareBikeCompanies[2].borrowBike(bikeId);
break;
default:
System.out.println(" 1- 3");
break;
}*/
}
private void chaKan(Scanner sc) {
for (int i = 0; i < shareBikeCompanies.length; i++) {
System.out.println("|公司id|公司名|单车数量|借出次数|");
System.out.print(shareBikeCompanies[i].getId() + " ");
System.out.print(shareBikeCompanies[i].getName() + " ");
System.out.print(shareBikeCompanies[i].getSum() + " ");
System.out.print(shareBikeCompanies[i].getCount());
System.out.println();
ShareBike[] shareBikes = shareBikeCompanies[i].getShareBikes();
System.out.println("|单车id|状态|借出时间|");
//对公司 的单车数组遍历
for (int j = 0; j < shareBikeCompanies[i].getSum(); j++) {
System.out.print(shareBikes[j].getId() + " ");
System.out.print(shareBikes[j].getStatus() + " ");
System.out.print(shareBikes[j].getBorrowTime() + " ");
System.out.println();
}
}
}
private void touFang(Scanner sc) {
System.out.println(" 1 Ofo");
System.out.println(" 2 Halo");
System.out.println(" 3 MoBike");
System.out.println("请选择公司 : ");
int companyNum = sc.nextInt();
System.out.println("请录入投放数量: ");
int bikeNum = sc.nextInt();
switch (companyNum) {
case 1:
//
shareBikeCompanies[0].addBike(bikeNum);
break;
case 2:
//
shareBikeCompanies[1].addBike(bikeNum);
break;
case 3:
//
shareBikeCompanies[2].addBike(bikeNum);
break;
default:
System.out.println(" 1- 3");
break;
}
}
}
App 文件
该文件完成的就是程序的入口。
public class App {
public static void main(String[] args) {
new ShareBikeMgr().menu();
}
}
补充
这三个类的目的是 因为不同的公司对应的增删改查肯定不同,所以创建这三个文件来完成自己相对于的增删改查,但是本程序中的增删改查相同,所以直接在公司的那个文件夹中实现即可。实现之后,这三个类继承总的公司类即可。
总结
1.人机交互文件不是最终的程序入口,程序入口只需像App文件当中一样去实现
2.方法的实现由小到大写入文件,比如车辆的增删改查的方法实现在车辆公司类当中,车辆公司的具体方法实现在人机交互类当中。
具体为:
在ShareBikeMgr文件当中实现公司对象的创建:
在这个文件当中实现公司的具体方法:
然后再在ShareBikeCompany当中去实现车辆的具体操作。
多思考思考其中的意思。
3.思考怎么传递参数较方便。怎么使用对象。