项目文件如图
MainProject类
package com.canmeng.domain;
import java.util.Scanner;
import com.canmeng.entity.Player;
import com.canmeng.function.TeemManager;
import com.canmeng.mycompare.MyCompare;
import com.canmeng.myexception.NullPlayerException;
import com.canmeng.myexception.PlayerIDException;
import com.canmeng.viewer.TMViewer;
import com.canmeng.viewer.impl.TMViewerImpl;
public class MainProject {
public static void main(String[] args) throws PlayerIDException, NullPlayerException {
//用户界面选择
int choose = 0;
TMViewer TMV = new TMViewerImpl();
Scanner scanner = new Scanner(System.in);
TeemManager teemManager = new TeemManager("canmeng");
for (int i = 0; i < 10; i++) {
String name = "CanMeng" + i;
char gender = '男';
int age = (int) (Math.random() * 100);
double salary = Math.random() * 10000;
String location = "CanMengMeng";
Player newPlayerToAdd = new Player(name, gender, age, salary, location);
teemManager.employNewPlayer(newPlayerToAdd);
}
while (true) {
TMV.ClearScreen();
//主界面
TMV.menuViewer();
choose = scanner.nextInt();
scanner.nextLine();
TMV.ClearScreen();
int flag = -1;
switch (choose) {
case 1:
//查看所有球员
teemManager.showAllPlayers();
break;
case 2:
//雇佣新球员
TMV.PleaseInputName();
String name = scanner.nextLine();
TMV.PleaseInputGender();
char gender = scanner.nextLine().charAt(0);
TMV.PleaseInputAge();
int age = scanner.nextInt();
TMV.PleaseInputSalary();
double salary = scanner.nextDouble();
scanner.nextLine();
TMV.PleaseInputLocation();
String location = scanner.nextLine();
Player newPlayerToAdd = new Player(name, gender, age, salary, location);
teemManager.employNewPlayer(newPlayerToAdd);
break;
case 3:
//通过ID解雇球员
TMV.PleaseInputID();
int playerID = scanner.nextInt();
teemManager.layoffPlayerByID(playerID);
break;
case 4:
//通过ID修改球员信息
TMV.PleaseInputID();
playerID = scanner.nextInt();
teemManager.modifyPlayerById(playerID);
break;
case 5:
//通过ID查看球员信息
TMV.PleaseInputID();
playerID = scanner.nextInt();
teemManager.showPlayerByID(playerID);
break;
case 6:
//按照球员信息排序,需展示其子界面
TMV.menuViewerBySort();
choose = scanner.nextInt();
scanner.nextLine();
TMV.ClearScreen();
switch (choose) {
case 1:
//根据ID排序
TMV.menuViewerBySortAscendingOrDecending();
choose = scanner.nextInt();
if (choose == 1) {
teemManager.selectSortUsingMyCompare(new MyCompare() {
@Override
public boolean compareTwoPlayer(Player p1, Player p2) {
return p1.getId() > p2.getId();
}
});
} else if (choose ==2) {
teemManager.selectSortUsingMyCompare(new MyCompare() {
@Override
public boolean compareTwoPlayer(Player p1, Player p2) {
return p1.getId() < p2.getId();
}
});
}else {
break;
}
case 2:
//根据年龄排序
TMV.menuViewerBySortAscendingOrDecending();
choose = scanner.nextInt();
if (choose == 1) {
teemManager.selectSortUsingMyCompare(new MyCompare() {
@Override
public boolean compareTwoPlayer(Player p1, Player p2) {
return p1.getAge() > p2.getAge();
}
});
} else if (choose ==2) {
teemManager.selectSortUsingMyCompare(new MyCompare() {
@Override
public boolean compareTwoPlayer(Player p1, Player p2) {
return p1.getAge() < p2.getAge();
}
});
}else {
break;
}
case 3:
//根据工资排序
TMV.menuViewerBySortAscendingOrDecending();
choose = scanner.nextInt();
if (choose == 1) {
teemManager.selectSortUsingMyCompare(new MyCompare() {
@Override
public boolean compareTwoPlayer(Player p1, Player p2) {
return p1.getSalary() > p2.getSalary();
}
});
} else if (choose ==2) {
teemManager.selectSortUsingMyCompare(new MyCompare() {
@Override
public boolean compareTwoPlayer(Player p1, Player p2) {
return p1.getSalary() < p2.getSalary();
}
});
}else {
break;
}
case 4:
break;
default:
break;
}
break;
case 7:
flag = 1;
break;
default:
break;
}//switch
if (flag != -1) {
break;
}else {
TMV.PromptEnterKeyToContinue();
new Scanner(System.in).nextLine();
}
}//while true
}
}
Player类
package com.canmeng.entity;
public class Player {
private static int PLAYER_ID = 0;
private int id;
private String name;
private char gender;
private int age;
private double salary;
private String location;
{
PLAYER_ID++;
}
//构造方法
public Player() {}
public Player(String name, char gender, int age, double salary, String location) {
this.id = PLAYER_ID;
this.name = name;
this.gender = gender;
this.age = age;
this.salary = salary;
this.location = location;
}
//getter 和 setter 方法
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
@Override
public String toString() {
return "Player [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + ", salary=" + salary
+ ", location=" + location + "]";
}
}
TeemManager类
package com.canmeng.function;
import java.util.Scanner;
import com.canmeng.entity.Player;
import com.canmeng.mycompare.MyCompare;
import com.canmeng.myexception.NullPlayerException;
import com.canmeng.myexception.PlayerIDException;
import com.canmeng.viewer.TMViewer;
import com.canmeng.viewer.impl.TMViewerImpl;
public class TeemManager {
private String name;
//保存Player类对象
private Player[] allPlayers = new Player[DEFAULT_CAPACITY];
//统计计数,统计当前allPlayers数组有多少元素
private static int itemCount = 0;
//默认的球队球员可容纳个数,方便维护
private static final int DEFAULT_CAPACITY = 10;
private static TMViewer tmViewer = new TMViewerImpl();
private static Scanner scanner = new Scanner(System.in);
//构造方法
public TeemManager() {}
public TeemManager(String name) {
this.name = name;
}
//getter 和 setter 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 雇佣新球员
* @param newPlayerToAdd 传入的player类对象,用于保存到TeemManager球员数组中
* @return boolean 返回true表示添加成功,返回false表示添加失败
*/
public boolean employNewPlayer(Player newPlayerToAdd) throws NullPlayerException{
//参数合法性判断
if (newPlayerToAdd == null) {
throw new NullPlayerException("球员信息为空");
}
if (itemCount == this.allPlayers.length) {
grow();
}
//添加球员到Player数组中,有效元素末尾
this.allPlayers[itemCount++] = newPlayerToAdd;
return true;
}
/**
* 私有化方法,用于在添加球员时,原本数组长度不够用的情况下,扩容数组
*/
private void grow() {
//1. 获取原本的数组容量
int oldCapacity = this.allPlayers.length;
//2. 定义新的数组容量,是原本数组容量的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
//3. 创建新的数组
Player[] newArray = new Player[newCapacity];
//4. 拷贝数据
for (int i = 0; i < oldCapacity; i++) {
newArray[i] = this.allPlayers[i];
}
this.allPlayers = newArray;
}
/**
* 通过球员ID号删除球员
* @param playerID 球员ID号
* @return 返回true表示删除成功,返回false表示删除失败
* @throws PlayerIDException
*/
public boolean layoffPlayerByID(int playerID) throws PlayerIDException {
int index = findIndexByPlayerID(playerID);
if (index != -1) {
for (int i = index; i < itemCount - 1; i++) {
allPlayers[i] = allPlayers[i + 1];
}
allPlayers[--itemCount] = null;
return true;
}else {
//使用界面接口来完成展示
tmViewer.deleteError();
return false;
}
}
/**
* 根据球员ID号更改球员信息
* @param playerID
*/
public void modifyPlayerById(int playerID) throws PlayerIDException{
int index = findIndexByPlayerID(playerID);
if(index != -1) {
int flag = -1;
//作为一个临时变量
Player temp = this.allPlayers[index];
while (true) {
tmViewer.modifyPlayerInfo(temp);
int choose = scanner.nextInt();
scanner.nextLine();
//利用switch-case结构完成修改
switch (choose) {
case 1:
tmViewer.PleaseInputName();
String name = scanner.nextLine();
temp.setName(name);
break;
case 2:
tmViewer.PleaseInputGender();
char gender = scanner.nextLine().charAt(0);
//过滤数据
if (gender == '男' || gender == '女') {
temp.setGender(gender);
}else {
tmViewer.GenderError();
temp.setGender('男');
}
break;
case 3:
tmViewer.PleaseInputAge();
int age = scanner.nextInt();
if (age > 0 || age < 45) {
temp.setAge(age);
}else {
temp.setAge(18);
}
break;
case 4:
tmViewer.PleaseInputSalary();
double salary = scanner.nextDouble();
if (salary > 0) {
temp.setSalary(salary);
}else {
temp.setSalary(8000);
}
break;
case 5:
tmViewer.PleaseInputLocation();
String location = scanner.nextLine();
temp.setLocation(location);
break;
case 6:
flag = 1;
tmViewer.modifyComplete();
break;
default:
break;
}//switch
if (flag == 1) {
break;
}
}//while true
}else {
}
}
/**
* 通过球员ID展示对应的球员信息
* @param playerID
* @return
*/
public void showPlayerByID(int playerID) throws PlayerIDException{
int index = findIndexByPlayerID(playerID);
if (index != -1) {
tmViewer.showPlayer(this.allPlayers[index]);
}
}
/**
* 根据球员工资倒序排序
*
*/
public void selectSortBySalaryDecending() {
//数据保护,排序数据拿出来,拷贝一份
Player[] sortTemp = new Player[itemCount];
for (int i = 0; i < itemCount; i++) {
sortTemp[i] = this.allPlayers[i];
}
//选择排序算法
for(int i = 0; i < itemCount - 1; i++) {
int index = i;
for(int j = i; j < itemCount; j++) {
if (sortTemp[index].getSalary() < sortTemp[j].getSalary()) {
index = j;
}
}
if (index != i) {
Player temp = sortTemp[index];
sortTemp[index] = sortTemp[i];
sortTemp[i] = temp;
}
}
//展示效果
for (int i = 0; i < itemCount; i++) {
System.out.println(sortTemp[i]);
}
}
/**
* 根据年龄升序排序
*/
public void selectSortByAgeAscending() {
//数据保护,排序数据拿出来,拷贝一份
Player[] sortTemp = new Player[itemCount];
for (int i = 0; i < itemCount; i++) {
sortTemp[i] = this.allPlayers[i];
}
//选择排序算法
for(int i = 0; i < itemCount - 1; i++) {
int index = i;
for(int j = i; j < itemCount; j++) {
if (sortTemp[index].getAge() > sortTemp[j].getAge()) {
index = j;
}
}
if (index != i) {
Player temp = sortTemp[index];
sortTemp[index] = sortTemp[i];
sortTemp[i] = temp;
}
}
//展示效果
for (int i = 0; i < itemCount; i++) {
System.out.println(sortTemp[i]);
}
}
/**
* 根据ID降序排序
*/
public void selectSortByIDDecending() {
//数据保护,排序数据拿出来,拷贝一份
Player[] sortTemp = new Player[itemCount];
for (int i = 0; i < itemCount; i++) {
sortTemp[i] = this.allPlayers[i];
}
//选择排序算法
for(int i = 0; i < itemCount - 1; i++) {
int index = i;
for(int j = i; j < itemCount; j++) {
if (sortTemp[index].getId() < sortTemp[j].getId()) {
index = j;
}
}
if (index != i) {
Player temp = sortTemp[index];
sortTemp[index] = sortTemp[i];
sortTemp[i] = temp;
}
}
//展示效果
for (int i = 0; i < itemCount; i++) {
System.out.println(sortTemp[i]);
}
}
/**
* 通用的排序算法,只要提供对应的比较法则就可以
* @param compare 传入的比较器
*/
public void selectSortUsingMyCompare(MyCompare compare) {
//数据保护,排序数据拿出来,拷贝一份
Player[] sortTemp = new Player[itemCount];
for (int i = 0; i < itemCount; i++) {
sortTemp[i] = this.allPlayers[i];
}
//选择排序算法
for(int i = 0; i < itemCount - 1; i++) {
int index = i;
for(int j = i; j < itemCount; j++) {
if (compare.compareTwoPlayer(sortTemp[index], sortTemp[j])) {
index = j;
}
}
if (index != i) {
Player temp = sortTemp[index];
sortTemp[index] = sortTemp[i];
sortTemp[i] = temp;
}
}
//展示效果
for (int i = 0; i < itemCount; i++) {
System.out.println(sortTemp[i]);
}
}
/**
* 展示已有队员的信息
*/
public void showAllPlayers() {
for (int i = 0; i < itemCount; i++) {
tmViewer.showPlayer(this.allPlayers[i]);
}
}
/**
* 私有化方法,提供给类内需要球员ID查询球员在数组中的下标的方法
* @param playerID
* @return 返回大于等于0,表示找到球员,返回-1,表示没有找到
*/
private int findIndexByPlayerID(int playerID) throws PlayerIDException{
if(playerID < 0 || playerID > 100) {
throw new PlayerIDException("传入球员ID不合法!");
}
int index = -1;
for (int i = 0; i < itemCount; i++) {
if(this.allPlayers[i].getId() == playerID) {
index = i;
break;
}
}
return index;
}
}
MyCompare接口
package com.canmeng.mycompare;
import com.canmeng.entity.Player;
/**
* 这里是自定义的比较器接口,里面规定比较的方式,应该使用哪一个方法
* @author CanMeng
*
*/
public interface MyCompare {
/**
* 这里是自定义的比较方式,要求所有遵从该接口的类,都要完成这个方法
* @param p1
* @param p2
* @return boolean类型,根据实际情况判断其含义
*/
public boolean compareTwoPlayer(Player p1, Player p2);
}
NullPlayerException异常
package com.canmeng.myexception;
public class NullPlayerException extends Exception {
private static final long serialVersionUID = 1L;
public NullPlayerException(String message) {
super(message);
}
}
PlayerIDException异常
package com.canmeng.myexception;
public class PlayerIDException extends Exception{
private static final long serialVersionUID = 1L;
public PlayerIDException(String message) {
super(message);
}
}
TMViewer接口
package com.canmeng.viewer;
import com.canmeng.entity.Player;
public interface TMViewer {
/**
* 删除球员错误提示
*/
public void deleteError();
/**
* 用户输入性别错误提示
*/
public void GenderError();
/**
* 查找球员错误提示
*/
public void NotFound();
/**
* 修改球员信息界面
* @param temp 传入的球员类,用于展示球员当前数据
*/
public void modifyPlayerInfo(Player temp);
/**
* 提示用户输入ID
*/
public void PleaseInputID();
/**
* 提示用户输入姓名
*/
public void PleaseInputName();
/**
* 提示用户输入性别
*/
public void PleaseInputGender();
/**
* 提示用户输入年龄
*/
public void PleaseInputAge();
/**
* 提示用户输入工资
*/
public void PleaseInputSalary();
/**
* 提示用户输入位置
*/
public void PleaseInputLocation();
/**
* 修改球员信息完成
*/
public void modifyComplete();
/**
* 选项错误选择提示
*/
public void defaultAttention();
/**
* 主菜单界面
*/
public void menuViewer();
/**
* 展示传入的球员信息
* @param temp
*/
public void showPlayer(Player temp);
/**
* 清屏功能
*/
public void ClearScreen();
/**
* 提示用户输入回车键继续
*/
public void PromptEnterKeyToContinue();
/**
* 球员排序子界面
*/
public void menuViewerBySort();
/**
* 排序选择升序或者降序界面
*/
public void menuViewerBySortAscendingOrDecending();
}
TMViewerImpl类
package com.canmeng.viewer.impl;
import com.canmeng.entity.Player;
import com.canmeng.viewer.TMViewer;
public class TMViewerImpl implements TMViewer {
@Override
public void deleteError() {
System.out.println("查无此人,无法删除");
}
@Override
public void modifyPlayerInfo(Player temp) {
System.out.println("修改" + temp.getName() + "球员信息:");
System.out.println("1. 修改球员姓名 ");
System.out.println("2. 修改球员性别 ");
System.out.println("3. 修改球员年龄 ");
System.out.println("4. 修改球员工资 ");
System.out.println("5. 修改球员位置 ");
System.out.println("6. 结束修改 ");
}
@Override
public void PleaseInputName() {
System.out.println("请输入球员姓名:");
}
@Override
public void PleaseInputGender() {
System.out.println("请输入球员性别:");
}
@Override
public void PleaseInputAge() {
System.out.println("请输入球员年龄:");
}
@Override
public void PleaseInputSalary() {
System.out.println("请输入球员工资:");
}
@Override
public void PleaseInputLocation() {
System.out.println("请输入球员位置:");
}
@Override
public void GenderError() {
System.out.println("输入错误,默认性别为男");
}
@Override
public void modifyComplete() {
System.out.println("修改完成 退出.");
}
@Override
public void defaultAttention() {
System.out.println("What are you 弄啥嘞");
}
@Override
public void NotFound() {
System.out.println("查无此人,无法修改");
}
@Override
public void menuViewer() {
System.out.println("欢迎来到实力至上主义的教室");
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
System.out.println("$ 1. 查看所有球员 $");
System.out.println("$ 2. 雇佣新球员 $");
System.out.println("$ 3. 通过ID解雇球员 $");
System.out.println("$ 4. 通过ID修改球员信息 $");
System.out.println("$ 5. 通过ID查看球员信息 $");
System.out.println("$ 6. 按照球员信息排序 $");
System.out.println("$ 7. 退出 $");
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
}
@Override
public void showPlayer(Player temp) {
System.out.println(temp);
}
@Override
public void PleaseInputID() {
System.out.println("请输入球员ID:");
}
@Override
public void ClearScreen() {
for (int i = 0; i < 20; i++) {
System.out.println();
}
}
@Override
public void PromptEnterKeyToContinue() {
System.out.println("输入回车键以继续......");
}
@Override
public void menuViewerBySort() {
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
System.out.println("$ 1. 根据ID排序 $");
System.out.println("$ 2. 根据年龄排序 $");
System.out.println("$ 3. 根据工资排序 $");
System.out.println("$ 4. 退出 $");
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
}
@Override
public void menuViewerBySortAscendingOrDecending() {
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
System.out.println("$ 1. 升序 $");
System.out.println("$ 2. 降序 $");
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
}
}