其他分享
首页 > 其他分享> > 20220715_第七小组_张红睿_学习笔记

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