ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

20220715_第七小组_张红睿_学习笔记

2022-07-16 10:31:07  阅读:137  来源: 互联网

标签:arr 20220715 int System 笔记 员工 println 张红睿 out


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有