Java实现球员管理系统(代码篇)


项目文件如图

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("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
	}
	
	
	
}




  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值