20220715_第七小组_张红睿_学习笔记
作者:互联网
Java基础第三天
可视化算法数据结构链接: https://visualgo.net/zh/
1. 重点
1.1 二分查找
二分查找:是在有序序列中进行的,通过附加左右指针的方法,每次循环查询中间值是否为被查询目标值为目的,以当左指针小等于右指针情况作为循环的条件,知道定义的中间值变量为目标值为准并返回下标,不存在返回-1
public static int selectElement(int[] arr, int target){
int left = 0;
int right = arr.length - 1;
if (target < arr[left] || target > arr[right])
return -1;
while (left <= right){
int middle = (left + right) / 2;
if (target == arr[middle])
return middle;
else if (target < arr[middle]) {
right = middle - 1;
}
else {
left = middle + 1;
}
}
return -1;
}
1.2 冒泡排序
附带交换swap函数和输出print函数,应用于下方三个排序算法。
private static void swap(int[] arr, int a, int b){
// 这里必须要加上数组参数 才能达到交换的目的
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
private static void print(int[] arr){
for (int value : arr)
System.out.print(value + " ");
System.out.println();
}
冒泡排序:每一次循环按照升/降序比较相邻的两个数并交换直到最后一个元素,重复执行直到得到指定序列。
public static void bubbleSort(int[] arr){
int count = 0; // 可删
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if(arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
// 以下可删
count++;
System.out.print("第" + (count) + "轮的比较结果为: ");
print(arr);
}
}
}
}
1.3 选择排序
选择排序:如果是升序,那么每次循环找到数列中最小的元素并放置在左侧,放好后固定不动,直到得到指定序列。
public static void selectionSort(int[] arr){
int count = 0; // 可删
for (int i = 0; i < arr.length - 1; i++) {
// 选择一个最小的放在左侧 升序排列
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex])
minIndex = j;
}
swap(arr, minIndex, i);
// 以下可删
count++;
System.out.print("第" + (count) + "轮的比较结果为: ");
print(arr);
}
}
1.4 插入排序
插入排序:以第一个元素作为一个有序的升/降序序列,以第二个元素开始从左向右依次插入到该有序序列中。
public static void insertionSort(int[] arr){
int count = 0; // 可删
// 插入排序,将每一个数按照升序的规则插入到一个有序数列,其中第一个元素默认为该序列的第一项
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j > 0; j--) {
if (arr[j - 1] > arr[j]) {
swap(arr, j - 1, j);
// 以下可删
count++;
System.out.print("第" + (count) + "轮的比较结果为: ");
print(arr);
}
}
}
}
2. 案例
基于Scanner键盘输入的简易员工管理系统:
原版是实现了基本功能的,但代码都集中在主函数中,代码冗余度高不美观,故下方附带优化版。
结果展示截图在代码下方
原版:
点击查看代码
/**
* 功能:
* 1.可进行员工的添加
* 2.可通过员工号进行查询员工
* 3.可通过员工号进行修改员工信息
* 4.可通过员工号进行删除员工信息
* 5.可查询员工信息
* 6.可进行大部分的输入合法性检验
* 7.可进行上述功能的无效性检验, 比如删除时判断是否能删
*
* 要求:
* 1.员工工号由1001自增,固定且不能更改
* 2.添加员工时需要判断是否需要扩容
*/
public class ManageSystem {
public static void main(String[] args) {
int[] nos = new int[10]; // 员工id
String[] names = new String[10]; // 员工姓名 二者一一对应
int defaultNo = 1001;
Scanner sc = new Scanner(System.in);
System.out.println("欢迎使用员工管理系统: ");
while(true) {
String flag;
while (true) {
System.out.println("请选择功能: 1.添加员工 2.查询员工 3.修改员工 4.删除员工 5.查看现有员工 6.退出");
flag = sc.next();
if (flag.equals("1") || flag.equals("2") || flag.equals("3")
|| flag.equals("4") || flag.equals("5") || flag.equals("6"))
break;
System.out.println("无效输入,请重新输入!");
}
switch (flag) {
case "1":
System.out.println("请输入员工姓名: ");
String name = sc.next();
/*
员工信息要保存到数组中
1.工号(不能输入,自动生成的自动递增的一个数字1001)
2.员工姓名
员工的工号和姓名都是保存到数组里
int[] nos = new int[10];
String[] names = new String[10];
上述两个数组可以用一个二维数组 ?
*/
// 添加姓名和工号到相应数组中
// 判断数组是否满了 如果满了就扩充10个元素
if (nos[nos.length - 1] != 0) {
int[] tm0p_nos = new int[nos.length + 10];
String[] tmp_names = new String[names.length + 10];
for (int i = 0; i < nos.length; i++) {
tmp_nos[i] = nos[i];
tmp_names[i] = names[i];
}
nos = tmp_nos;
names = tmp_names;
}
// 添加员工信息 遍历已有数组知道找到第一个空值 并赋值
for (int i = 0; i < nos.length; i++) {
if (nos[i] != 0)
continue;
nos[i] = defaultNo;
names[i] = name;
defaultNo++;
System.out.println("添加成功!");
break; // 添加成功后要跳出
}
break;
case "2":
/*
根据工号查询
如果有能力的,可以去做根据姓名查询,姓名可以重复,工号不可以重复。
可用线性查找或二分法查找
排序 根据工号倒序排序
*/
String queryType = null;
while (true) {
System.out.println("请选择查询方式: 1.根据工号查询 2.根据姓名查询");
queryType = sc.next();
if (queryType.equals("1") || queryType.equals("2"))
break;
System.out.println("无效输入,请重新输入!");
}
switch (queryType) {
case "1":
boolean existStaff = false; // 布尔变量 被查询员工是否存在 默认不存在
System.out.println("请输入工号:");
int inputNo = sc.nextInt();
// 线性查找
for (int i = 0; i < nos.length; i++) {
if (nos[i] != 0 && nos[i] == inputNo) {
System.out.println("查询成功! 信息为: ");
System.out.println("工号: " + nos[i] + " 姓名: " + names[i]);
existStaff = true;
break; // 因为工号不重复 所以查询成功后要break
}
}
if (!existStaff)
System.out.println("无此员工。");
break;
case "2":
existStaff = false;
System.out.println("请输入姓名:");
String inputName = sc.next();
// 线性查找
for (int i = 0; i < nos.length; i++) {
if (names[i] != null && names[i].equals(inputName)) {
System.out.println("查询成功! 信息为: ");
System.out.println("工号: " + nos[i] + " 姓名: " + names[i]);
existStaff = true;
}
}
if (!existStaff)
System.out.println("无此员工。");
break;
}
break;
case "3":
/*
修改两个操作:
先输入员工号,先查询员工号是否存在,
如果不在,员工输入有误
如果在,先显示除原有信息,请输入新的名字,
修改信息。1002 nos[1] names[1]
*/
boolean existStaff = false;
System.out.println("请输入要查询的员工号:");
int inputNo = sc.nextInt();
for (int i = 0; i < nos.length; i++) {
if (inputNo == nos[i]) {
existStaff = true;
System.out.println("工号: " + nos[i] + " 姓名: " + names[i]);
System.out.println("请输入新的姓名:");
String inputName = sc.next();
names[i] = inputName;
System.out.println("修改成功! 新信息为: ");
System.out.println("工号: " + nos[i] + " 姓名: " + names[i]);
break;
}
}
if (!existStaff) {
System.out.println("员工输入有误。");
}
break;
case "4":
/*
数组删除元素;
涉及到移位的问题。
int[] 0
String[] null
*/
existStaff = false;
System.out.println("请输入要删除的员工号: ");
inputNo = sc.nextInt();
for (int i = 0; i < nos.length; i++) {
if (inputNo == nos[i]) {
existStaff = true;
System.out.println("员工号存在! 正在删除中...");
nos[i] = 0;
names[i] = null;
// 移位
int j;
for (j = i; j < nos.length - 1; j++) {
nos[j] = nos[j + 1];
names[j] = names[j + 1];
}
// 最后一个要置空 避免信息重复
nos[j] = 0;
names[j] = null;
System.out.println("删除成功!");
break;
}
}
if (!existStaff) {
System.out.println("员工输入有误。");
}
break;
case "5":
for (int i = 0; i < nos.length; i++) {
if(nos[i] == 0)
break;
System.out.println("工号: " + nos[i] + " 姓名: " + names[i]);
}
break;
case "6":
System.out.println("程序正在退出,感谢使用...");
System.exit(0);
}
}
}
}
增
删
查
改
优化版:
点击查看代码
/**
* 功能:
* 1.可进行员工的添加
* 2.可通过员工号进行查询员工
* 3.可通过员工号进行修改员工信息
* 4.可通过员工号进行删除员工信息
* 5.可查询员工信息
* 6.可进行大部分的输入合法性检验
* 7.可进行上述功能的无效性检验, 比如删除时判断是否能删
*
* 优化:
* 1.在前面原本的基础上增加了可通过姓名进行查询、修改的功能
* 2.可判定在通过姓名修改时如有重名的现象可再通过员工号进行修改
* 3.增加了更多的操控功能, 如进入查询后可直接进行返回和退出的操作
* 4.增加了大部分输入数据的合法性检验
* 5.增加了大部分功能的无效性检验(目前测试中未发现bug)。
* 6.各个函数功能分理清晰, 更美观, 效益更高。
*
* 要求:
* 1.员工工号由1001自增,固定且不能更改
* 2.添加员工时需要判断是否需要扩容
*/
public class NewManageSystem {
private static int[] staffId = new int[5];
private static String[] staffName = new String[5];
private static int defaultId = 1001;
private static boolean isZeroInt(int x){
if(x == 0)
return true;
return false;
}
private static boolean isNullString(String str){
if(str.equals(""))
return true;
return false;
}
private static boolean isFull(){
for (int i = 0; i < staffId.length; i++)
if(staffId[i] == 0)
return false;
return true;
}
/**
* 判断员工id是否存在
* @param id 查询的员工id
* @return 存在返回对应下标
* 不存在返回-1
*/
private static int isExistStaffId(int id){
for (int i = 0; i < staffId.length; i++)
if(staffId[i] == id)
return i;
return -1;
}
/**
* 判断员工id是否存在
* @param name 查询的员工name
* @return 存在返回对应下标
* 不存在返回-1
*/
private static int isExistStaffName(String name){
for (int i = 0; i < staffName.length; i++) {
if(staffName[i] == null)
break;
else if (staffName[i].equals(name))
return i;
}
return -1;
}
/**
* 通过指定姓名获取全部姓名的下标
* @param name 查询的员工name
* @return 返回所有对应下标
* 不存在返回空数组
*/
private static int[] getAllStaffByName(String name){
int[] allNameIndexes = new int[0];
for (int i = 0, j = 0; i < staffName.length; i++) {
if (staffName[i] == null)
break;
else if (staffName[i].equals(name)) {
allNameIndexes = extendArrayOnSetArray(allNameIndexes, 1);
allNameIndexes[j] = i;
j++;
}
}
return allNameIndexes;
}
/**
* 增加数组长度
* @param extendLength 要增加的数组长度
*/
private static void extendArray(int extendLength){
int[] tmpInt = new int[staffId.length + extendLength];
String[] tmpString = new String[staffName.length + extendLength];
for (int i = 0; i < staffId.length; i++) {
tmpInt[i] = staffId[i];
tmpString[i] = staffName[i];
}
staffId = tmpInt;
staffName = tmpString;
}
private static int[] extendArrayOnSetArray(int[] arr, int extendLength){
int[] tmpInt = new int[arr.length + extendLength];
for (int i = 0; i < arr.length; i++) {
tmpInt[i] = arr[i];
}
return tmpInt;
}
/**
* 添加员工信息
* @param name 要添加的员工姓名
*/
private static void addStaffInfo(String name){
if(isFull())
extendArray(5);
for (int i = 0; i < staffId.length; i++) {
if(isZeroInt(staffId[i])){
staffId[i] = defaultId;
staffName[i] = name;
defaultId++;
System.out.println("添加成功! ");
break;
}
}
}
private static boolean deleteStaffInfo(int delId){
int delIndex = isExistStaffId(delId);
if(delIndex == -1)
return false;
staffId[delIndex] = 0;
staffName[delIndex] = null;
int i = 0;
for (i = delIndex; i < staffId.length - 1; i++) {
if(staffId[i + 1] == 0)
break;
staffId[i] = staffId[i + 1];
staffName[i] = staffName[i + 1];
}
staffId[i] = 0;
staffName[i] = null;
return true;
}
private static void showStaffInfo(){
System.out.println("正在展示员工信息...");
if(staffId.length == 0)
System.out.println("无员工信息!");
for (int i = 0; i < staffId.length; i++) {
if(staffId[i] == 0)
break;
System.out.println("员工工号: " + staffId[i] + "\t员工姓名: " + staffName[i]);
}
System.out.println("展示结束...");
}
// 二分查找
private static int selectIdByBinarySearch(int[] arr, int target){
int left = 0;
int right = arr.length - 1;
if (target < arr[left] || target > arr[right])
return -1;
while (left <= right){
int middle = (left + right) / 2;
if (target == arr[middle])
return middle;
else if (target < arr[middle]) {
right = middle - 1;
}
else {
left = middle + 1;
}
}
return -1;
}
private static void exitProgram(){
System.out.println("程序即将退出, 感谢使用...");
System.exit(0);
}
private static void design(){
Scanner input = new Scanner(System.in);
int inputId; // 输入的员工id
String inputName; // 输入的员工姓名
String flags; // 输入的标记 生命为String是为了方便判断合法性
System.out.println("欢迎来到员工管理系统: ");
while(true){
System.out.println("------------------------------------------------");
// 检验 输入标记 合法性
while(true) {
System.out.println("请输入: 1.添加, 2.查询, 3.修改, 4.删除, 5.展示, 0.退出");
flags = input.next();
// 判断输入的flags是否合法
if(flags.equals("1") || flags.equals("2") || flags.equals("3")
|| flags.equals("4") || flags.equals("5") || flags.equals("0"))
break;
System.out.println("无效输入, 请重新输入!");
}
switch (flags){
case "1": // 添加
System.out.println("请输入要添加的员工姓名: ");
inputName = input.next();
addStaffInfo(inputName);
break;
case "2": // 查询
// 重复 查询操作
while(true) {
while (true) {
System.out.println("请输入: 1.查询员工号, 2.查询员工姓名, 9.返回, 0.退出");
flags = input.next();
// 判断输入的flags是否合法
if (flags.equals("1") || flags.equals("2") || flags.equals("9")
|| flags.equals("0"))
break;
System.out.println("无效输入, 请重新输入!");
}
switch (flags) {
case "1":
System.out.println("请输入员工号: ");
inputId = input.nextInt();
int selectIndex = isExistStaffId(inputId);
if (selectIndex == -1) {
System.out.println("无此员工!");
break;
}
System.out.println("查询成功! 员工信息为: ");
System.out.println("工号: " + staffId[selectIndex] + "\t姓名: " + staffName[selectIndex]);
break;
case "2":
System.out.println("请输入员工姓名: ");
inputName = input.next();
int[] indexs = getAllStaffByName(inputName);
if(indexs.length == 0){
System.out.println("无此员工!");
break;
}
System.out.println("查询成功! 员工信息为: ");
for (int i: indexs) {
System.out.println("员工工号: " + staffId[i] + "\t姓名: " + staffName[i]);
}
break;
case "9":
break;
case "0":
exitProgram();
}
break;
}
break;
case "3": // 修改员工信息
while(true){
while (true) {
System.out.println("请输入: 1.根据员工号修改, 2.根据员工姓名修改, 9.返回, 0.退出");
flags = input.next();
// 判断输入的flags是否合法
if (flags.equals("1") || flags.equals("2") || flags.equals("9")
|| flags.equals("0"))
break;
System.out.println("无效输入, 请重新输入!");
}
switch (flags){
case "1":
System.out.println("请输入员工号: ");
inputId = input.nextInt();
int selectIndex = isExistStaffId(inputId);
if (selectIndex == -1) {
System.out.println("无此员工!");
break;
}
System.out.println("要修改的员工原信息为: ");
System.out.println("工号: " + staffId[selectIndex] + "\t姓名: " + staffName[selectIndex]);
// 输入 新 员工信息
System.out.println("请输入新姓名: ");
inputName = input.next();
staffName[selectIndex] = inputName;
System.out.println("恭喜你, 修改成功! 新信息为: ");
System.out.println("工号: " + staffId[selectIndex] + "\t姓名: " + staffName[selectIndex]);
break;
case "2":
System.out.println("请输入员工姓名: ");
inputName = input.next();
int[] indexs = getAllStaffByName(inputName);
if(indexs.length == 0){
System.out.println("无此员工!");
break;
}
System.out.println("要修改的员工原信息为: ");
//获取 姓名 对应的 全部 员工信息
for (int i = 0; i < indexs.length; i++) {
System.out.println(i + "-> 工号: " + staffId[indexs[i]] + "\t姓名: " + staffName[indexs[i]]);
}
selectIndex = 0; // 准确的修改员工工号下标
// 检验输入 要改的员工 工号 合法性
boolean isValid = false;
while (!isValid){
System.out.println("请输入你要改的员工的工号: ");
flags = input.next();
for (int i = 0; i < indexs.length; i++) {
if(flags.equals(String.valueOf(staffId[indexs[i]]))) {
selectIndex = indexs[i];
isValid = true;
break;
}
}
if(!isValid)
System.out.println("无效输入! 请重新输入: ");
}
// 输入 新 员工信息
System.out.println("请输入新姓名: ");
inputName = input.next();
staffName[selectIndex] = inputName;
System.out.println("恭喜你, 修改成功! 新信息为: ");
System.out.println("工号: " + staffId[selectIndex] + "\t姓名: " + staffName[selectIndex]);
break;
case "9":
break;
case "0":
exitProgram();
}
break;
}
break;
case "4": // 删除员工信息
System.out.println("请输入你要删除的员工工号: ");
while(true) {
try {
inputId = input.nextInt();
break;
}catch (NumberFormatException exp){
System.out.println("无效输入! 请重新输入员工工号: ");
}
}
if(deleteStaffInfo(inputId))
System.out.println("删除成功!");
break;
case "5": // 展示员工信息
showStaffInfo();
break;
case "0": // 退出程序
exitProgram();
}
}
}
public static void main(String[] args) {
design();
}
}
增
删
查
改
感谢观看
标签:arr,20220715,int,System,笔记,员工,println,张红睿,out 来源: https://www.cnblogs.com/blog-J/p/16483586.html