package com.tian.dao;
import java.util.Arrays;
import java.util.Scanner;
import com.tian.mycompare.MyCompare;
import com.tian.myexception.PlayerIDException;
/*
* 成员变量
* 用一个球员类对象的数组来保存球员对象
*
* 公开的方法:
* 雇佣新球员
* 解雇球员
* 修改球员信息
* 查看球员信息
* 按照工资排序(降序)
* 按照年龄排序(升序)
* 按照ID排序(降序)
* 展示所有球员
*
* 私有化方法:
* 提供给类内的成员方法使用
* 通过球员ID号找出当前球员所在数组的下标
* grow方法,用于扩容TeamManager里面保存球员的数组。
*/
//球队管理类
public class TeamManger {
private String name;
//默认的球队球员可容纳个数【方便维护】
private static final int DEFAULT_CAPACITY = 10;
private Player[] allPlayers = new Player[DEFAULT_CAPACITY];
// 统计计数,统计当前allPlayers数组中有多少元素,静态成员变量,程序不退出
private static int itemCount = 0;
// 类内能够使用的Scanner类对象
private Scanner sc = new Scanner(System.in);
// 构造方法
public TeamManger() {
}
public TeamManger(String name) {
this.name = name;
}
//雇佣新球
public boolean employenNewPlayer(Player newPlayerToAdd) {
if (null == newPlayerToAdd) {
System.out.println("传入球员为空,无法添加");
return false;
}
if(itemCount == this.allPlayers.length) {
//调用扩容数组方法进行【扩容】
grow();
}
// 添加新球员到数组中有效元素的末尾
this.allPlayers[itemCount++] = newPlayerToAdd;
return true;
}
// 通过球员ID号删除指定球员
public boolean layoffPlayerByID(int playerID) throws PlayerIDException {
//调用类内的私有化方法 通过球员ID查询球员在数组中下标
int index = findIndexByPlayerID(playerID);
// 如果找到了,index不为-1,然后删除,如果index为-1,表示没有找到
if (index != -1) {
for (int i = index; i < itemCount - 1; i++) {
allPlayers[i] = allPlayers[i + 1];
}
allPlayers[--itemCount] = null;
return true;
} else {
System.out.println("查无此人,无法删除");
return false;
}
}
// 通过球员的ID号修改球员信息
public void modifyPlayerByID(int playerID) throws PlayerIDException {
//利用自定义异常
//调用类内的私有化方法 通过球员ID查询球员在数组中下标
int index = findIndexByPlayerID(playerID);
//2.修改球员,其余条件是index值不为-1
if(index != -1) {
//3.修改信息
//设置一个标记
int flag = -1;
//temp作为一个零时变量
Player temp = this.allPlayers[index];
while(true) {
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
System.out.println("$$$ 修改:"+temp.getName()+"球员信息");
System.out.println("$$$ age:"+temp.getAge()+" gender:"+temp.getGender());
System.out.println("$$$ salary:"+temp.getSalary()+" location:"+temp.getLocation());
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.结束修改");
int choose = sc.nextInt();
sc.nextLine();
//利用switch - case结构完成修改操作
switch (choose) {
case 1:
//修改球员姓名
System.out.println("请输入球员姓名:");
String name = sc.nextLine();
temp.setName(name);
break;
case 2:
//修改球员性别
System.out.println("请输入球员性别:");
char gender = sc.nextLine().charAt(0);
//过滤gende数据,只保存男或者女
if('男' == gender||'女' == gender) {
temp.setGender(gender);
}else {
System.out.println("输入错误,默认为男");
temp.setGender('男');
}
break;
case 3:
//修改球员年龄
System.out.println("请输入球员年龄:");
int age = sc.nextInt();
if(age>0||age<45) {
temp.setAge(age);
}else {
temp.setAge(18);
}
break;
case 4:
//修改球员工资
System.out.println("请输入球员工资:");
double salary = sc.nextDouble();
if(salary>0) {
temp.setSalary(salary);
}else {
temp.setSalary(80000);
}
break;
case 5:
//修改球员位置
System.out.println("请输入球员位置:");
String location =sc.nextLine();
temp.setLocation(location);
break;
case 6:
flag = 1;
System.out.println("修改完成,退出!!!");
break;
default:
System.out.println("What are you 弄啥嘞?");
break;
}//switch
//利用标记flag判断
if(flag == 1) {
break; //跳出while ture 循环
}
}//while ture
}else {
System.out.println("查无此人,无法修改");
}
}
//通过球员ID展示球员信息
public void showPlayerByID(int playerID) throws PlayerIDException {
//调用类内的私有化方法 通过球员ID查询球员在数组中下标
int index = findIndexByPlayerID(playerID);
if(index != -1) {
System.out.println(this.allPlayers[index]);
}else {
System.out.println("查无此人,无法展示");
}
}
// 展示所有球员
public void showAllPlayers() {
for (int i = 0; i < itemCount; i++) {
System.out.println(allPlayers[i]);
}
}
public void show() {
for (int i = 0; i < allPlayers.length; i++) {
System.out.println(allPlayers[i]);
}
}
/*
* 按照工资排序(降序)
* 按照年龄排序(升序)
* 按照ID排序(降序)
*/
/*
// 按照工资排序(降序)
public void selectSortBySalaryDecending() {
//数据保护 把排序数据拿出来 拷贝一份
Player[] soretTemp =new Player[itemCount];
for(int i=0;i<itemCount;i++) {
soretTemp[i]= this.allPlayers[i];
}
//选择排序
for(int i = 0;i<itemCount-1;i++) {
int index = i;
for(int j= i+1;j<itemCount;j++) {
if(soretTemp[index].getSalary() < soretTemp[j].getSalary()) {
index = j;
}
}
if(index !=i) {
Player temp = soretTemp[index];
soretTemp[index] = soretTemp[i];
soretTemp[i] = temp;
}
}
for(int i=0;i<itemCount;i++) {
System.out.println(soretTemp[i]);
}
}
//按照年龄排序(升序
public void selectSortByAgeAscending() {
// 数据保护 把排序数据拿出来 拷贝一份
Player[] soretTemp = new Player[itemCount];
for (int i = 0; i < itemCount; i++) {
soretTemp[i] = this.allPlayers[i];
}
// 选择排序
for (int i = 0; i < itemCount - 1; i++) {
int index = i;
for (int j = i + 1; j < itemCount; j++) {
if (soretTemp[index].getAge() > soretTemp[j].getAge()) {
index = j;
}
}
if (index != i) {
Player temp = soretTemp[index];
soretTemp[index] = soretTemp[i];
soretTemp[i] = temp;
}
}
for (int i = 0; i < itemCount; i++) {
System.out.println(soretTemp[i]);
}
}
// 按照ID排序(降序)
public void selectSortByIDDecending() {
// 数据保护 把排序数据拿出来 拷贝一份
Player[] soretTemp = new Player[itemCount];
for (int i = 0; i < itemCount; i++) {
soretTemp[i] = this.allPlayers[i];
}
// 选择排序
for (int i = 0; i < itemCount - 1; i++) {
int index = i;
for (int j = i + 1; j < itemCount; j++) {
if (soretTemp[index].getId() < soretTemp[j].getId()) {
index = j;
}
}
if (index != i) {
Player temp = soretTemp[index];
soretTemp[index] = soretTemp[i];
soretTemp[i] = temp;
}
}
for (int i = 0; i < itemCount; i++) {
System.out.println(soretTemp[i]);
}
}
*/
/**
* 通用的排序算法
* @param com 传入的比较器接口
*/
public void selectSoetUsingMyCompare(MyCompare com) {
// 数据保护 把排序数据拿出来 拷贝一份
Player[] soretTemp = new Player[itemCount];
for (int i = 0; i < itemCount; i++) {
soretTemp[i] = this.allPlayers[i];
}
// 选择排序
for (int i = 0; i < itemCount - 1; i++) {
int index = i;
for (int j = i + 1; j < itemCount; j++) {
if (com.compareTwoPlayer(soretTemp[index], soretTemp[j])) {
index = j;
}
}
if (index != i) {
Player temp = soretTemp[index];
soretTemp[index] = soretTemp[i];
soretTemp[i] = temp;
}
}
for (int i = 0; i < itemCount; i++) {
System.out.println(soretTemp[i]);
}
}
/**
* 私有化方法,提供给类内需要通过球员ID查询球员在数组中下标的方法使用
* @param playID 传入的球员ID号
* @return 放回大于等于0,表示找到球员,返回-1,表示没有找到
* @throws PlayerIDException
*/
private int findIndexByPlayerID(int playerID) throws PlayerIDException {
// 利用自定义异常,处理参数合法性判断
if (playerID < 0 || playerID > 100) {
throw new PlayerIDException("传入球员ID不合法");
}
// 1找到和playerID一致的球员对象
int index = -1;
for (int i = 0; i < itemCount; i++) {
if (this.allPlayers[i].getId() == playerID) {
index = i;
break;
}
}
return index;
}
/**
*
* 私有化成员方法:grow方法,用于扩容TeamManager里面保存球员的数组。
*
*/
private void grow() {
//1.获取原本的数组容量
int oldCapacity = this.allPlayers.length;
//2.扩充数组容量为原来的1.5倍 【oldCapacity >> 1】 == 【oldCapacity/=2】
int newCapacity = oldCapacity +(oldCapacity >> 1);// 位运算 速度快
//3.创建新的数组
Player[] newArray = new Player[newCapacity];
//4.拷贝原来的数据
for(int i = 0; i < oldCapacity; i++) {
newArray[i] = this.allPlayers[i];
}
//5.保存新数组的地址
this.allPlayers = newArray;
}
}
package com.tian.dao;
//球员类
public class Player {
//成员变量
private int id;
private String name;
private char gender;
private int age;
private double salary;
private String location;
//构造方法
public Player() {}
public Player(int id,String name,char gender,int age,double salary,String location) {
this.id = id;
this.name = name;
this.gender = gender;
this.age = age;
this.salary = salary;
this.location =location;
}
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 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 + "]";
}
}
package com.tian.mycompare;
import com.tian.dao.Player;
/*
* 定义一个比较器接口,里面规定比较的方式,
* 应该使用哪一种根据需求选择
*
*
*/
public interface MyCompare {
/**
* 定义比较方式 要求所用【遵从】该接口的类,都要完成这个方法
* @param p1 传入player的类的对象
* @param p2 传入player的类的对象
* @return Boolean类型 根据实际判断含义
*/
public boolean compareTwoPlayer(Player p1,Player p2);
}
package com.tian.myexception;
/*
* 球员ID不合法的 异常信息,用于使用到球员ID位置,作为异常处理
* @author 田
*
*/
public class PlayerIDException extends Exception {
/**
* 暂时不考虑
*/
private static final long serialVersionUID = 1L;
/*
* 利用String类的字符串message作为异常的详细错误描述,放入到Exception中
* @param message
*/
public PlayerIDException(String message) {
super(message);
}
}
package com.tian.dao;
import com.tian.mycompare.MyCompare;
import com.tian.myexception.PlayerIDException;
public class MainProject {
public static void main(String[] args) throws PlayerIDException {
// TODO Auto-generated method stub
//球队管理类对象
TeamManger tm = new TeamManger("Housten");
for(int i=0;i<15;i++) {
int id =i;
String name = "YAO"+i;
char gender ='男';
int age = (int)(Math.random()*100);
double salary = Math.random()*100000;
String location = "C";
Player newPlayerToAdd = new Player(id, name, gender, age, salary, location);
tm.toString();
//测试添加方法
tm.employenNewPlayer(newPlayerToAdd);
}
/*
System.out.println("$$$$$$$$$$$$$$$$$$$$$ 展示所有球员信息 $$$$$$$$$$$$$$$$$$$$$$$$$$");
tm.showAllPlayers();
//System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 通过球员ID删除指定球员 $$$$$$$$$$$$$$$$$$$$$$$$$");
//tm.layoffPlayerByID(1);
//System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 通过球员ID修改球员信息 $$$$$$$$$$$$$$$$$$$$$$$");
//tm.modifyPlayerByID(2);
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 通过球员ID查找球员 $$$$$$$$$$$$$$$$$$$$$$$$");
tm.showPlayerByID(2);
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 展示所有球员信息 $$$$$$$$$$$$$$$$$$$$$$$");
tm.show();
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 根据薪资降序 $$$$$$$$$$$$$$$$$$$$$$$$$$");
tm.selectSortBySalaryDecending();
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 根据年龄升序 $$$$$$$$$$$$$$$$$$$$$$$$$$");
tm.selectSortByAgeAscending();
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 根据ID降序 $$$$$$$$$$$$$$$$$$$$$$$$$$$");
tm.selectSortByIDDecending();
*/
/*
//匿名内部类的匿名对象,直接作为方法的参数
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 根据薪资降序 $$$$$$$$$$$$$$$$$$$$$$$$$$");
tm.selectSoetUsingMyCompare(new MyCompare() {
@Override
public boolean compareTwoPlayer(Player p1, Player p2) {
return p1.getSalary() < p2.getSalary();
}
});
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 根据年龄升序 $$$$$$$$$$$$$$$$$$$$$$$$$$");
tm.selectSoetUsingMyCompare(new MyCompare() {
@Override
public boolean compareTwoPlayer(Player p1, Player p2) {
return p1.getAge() > p2.getAge();
}
});
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$ 根据ID升序 $$$$$$$$$$$$$$$$$$$$$$$$$$$");
tm.selectSoetUsingMyCompare(new MyCompare() {
@Override
public boolean compareTwoPlayer(Player p1, Player p2) {
// TODO Auto-generated method stub
return p1.getId() > p2.getId();
}
});
*/
//测试数组是否扩容
tm.showAllPlayers();
}
}
球员信息管理
最新推荐文章于 2024-01-18 20:08:03 发布