笔记: JavaSE day15 笔记

第十五天课堂笔记

数组

可变长参数★★★

  • 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 可变长参数名){}
  • 方法体 : 变长参数 相当于一个数组
  • 一个数组最多只能有一个可变长参数, 并放到列表的最后
  • parameter : 方法参数

数组相关算法★★

  • 冒泡排序

    • 由小到大: 从前向后两两比较,将大的通过交换放到后面
    • 轮数 : n个数 ,就是n-1轮
    • 每一轮判断次数: 第i轮 , n - i 次

    image-20240329113447194

  • 选择排序

    • n个元素, 进行n-1轮排序
    • 每一轮获取最小元素 和 第i个位置上的元素进行互换

    image-20240329140501309

  • 插入排序

    • 数组 分为 已排序 , 未排序 两部分
    • 遍历未排序的部分, 依序插入到已排序的部分中
    • 当前未排序数组第一个值j 的前一个就是已排序的最后一个 => i = j - 1
    • while循环向前找,知道找到在已排序数组对应的索引值 , 只要j对应的值小, 就让判断的那个i值向后移动

    image-20240329145443919

  • 代码如下

        /**
         * 插入排序
         *
         * @param arrs : 数组
         */
        private static void insertSort(int[] arrs) {
            // 未排序数组的循环遍历
            for (int j = 1; j < arrs.length; j++) {
                // 定义指针 => 已排序数组最后面的指针
                int i = j - 1;
                int temp = arrs[j];  // 获取i当前的数
                while (i >= 0 && temp < arrs[i]) {
                    arrs[i + 1] = arrs[i];  // 将值后移
                    i--;  // 继续判断前一个值
                }
                arrs[++i] = temp;  // 将j值插入到对应的位置
            }
        }
    
  • 二分查找算法

    • 前提 : 数组有序
    • 定义双指针 , 始终与中间元素比较, 相等找到了, 否则把范围缩小一半继续查找

    image-20240329160847992

  • 代码如下

       /**
         * 二分查找target
         *
         * @param arrs   : 数组
         * @param target : 目标值
         * @return : 返回索引值
         */
        private static int getBinarySearch(int[] arrs, int target) {
            int i = 0, j = arrs.length - 1; // 定义索引
            while (i <= j) {
                int mid = (i + j) >>> 1; // 获取中间值
                if (arrs[mid] == target) {
                    return mid;
                } else if (arrs[mid] < target) {
                    // 动i
                    i = mid + 1;
                } else if (target < arrs[mid]) {
                    // 动j
                    j = mid - 1;
                }
            }
            return -1;
        }
    
  • 使用递归实现

       /**
         * 使用递归实现
         *
         * @param arrs   : 数组
         * @param target : 目标值
         * @param start  : 开始至
         * @param end    : 结束值
         * @return : 返回索引
         */
        private static int binSeaGetTargetRecur(int[] arrs, int target, int start, int end) {
            if (start >= end) {
                return -1;
            }
            int mid = (start + end) >>> 1;
            if (arrs[mid] == target) {
                return mid;
            }
            if (arrs[mid] < target) {
                return binSeaGetTargetRecur(arrs, target, mid + 1, end);
            } else {
                return binSeaGetTargetRecur(arrs, target, start, mid);
            }
        }
    

Arrays类的常用方法★★★

  • asList() : 将数据转换为集合
  • int binarySearch(int[] arrs , int key) ; 二分查找
  • copeOf() : 复制数组
    • 定义一个新数组, 把数组中的数据复制到新数组中,返回新数组
    • 新数组长度可以更大,也可以更小
    • 长度更大, 把新数组索引复制给数组, => 数组扩容
  • fill() : 填充
  • sort() : 排序
  • stream() : 根据数组生成stream流
  • tostring() : 数组连接字符串
  • 代码如下
public static void main(String[] args) {
        // 定义一个数组
        int[] arrs = new int[]{1, 3, 5, 2, 5, 8, 4, 67, 3, 6};
        // asList(T... a) 返回由指定数组支持的固定大小的列表。
        List<int[]> list = Arrays.asList(arrs);
        System.out.println("list = " + list);
        //binarySearch(byte[] a, byte key)  :使用二进制搜索算法搜索指定值的指定字节数组。
        int target = 131;
        int i = Arrays.binarySearch(arrs, target);
        System.out.println("i = " + i);
        // copyOf(boolean[] original, int newLength) : 填充,以使副本具有指定的长度 : 数组扩容。
        int[] ints = Arrays.copyOf(arrs, arrs.length * 2);
        arrs = ints;
        System.out.println("Arrays.toString(arrs) = " + Arrays.toString(arrs));
        int[] ints1 = Arrays.copyOf(arrs, 5);
        System.out.println("Arrays.toString(ints1) = " + Arrays.toString(ints1));
        // copyOfRange(int[] original, int from, int to) : 将指定数组的指定范围复制到新数组中。
        int[] ints2 = Arrays.copyOfRange(arrs, 2, 5);
        System.out.println("Arrays.toString(ints2) = " + Arrays.toString(ints2));
        //fill(int[] a, int fromIndex, int toIndex, int val) : 将指定的int值分配给指定的int数组的指定范围的每个元素。
        Arrays.fill(arrs, 1, 3, 999);
        System.out.println("Arrays.toString(arrs) = " + Arrays.toString(arrs));
        //hashCode(int[] a) 根据指定数组的内容返回哈希码。
        System.out.println("Arrays.hashCode(arrs) = " + Arrays.hashCode(arrs));
        //parallelSort(int[] a)按照数字顺序排列指定的数组。
        Arrays.parallelSort(arrs);
        System.out.println("Arrays.toString(arrs) = " + Arrays.toString(arrs));
        //sort(int[] a, int fromIndex, int toIndex)按升序排列数组的指定范围。
        Arrays.sort(ints1);
        System.out.println("Arrays.toString(ints1) = " + Arrays.toString(ints1));
    }

对象数组

image-20240329172648828

  • 练习代码如下
/**
 * 对象数组练习题
 */
public class Test01ObjectArrs {
    public static void main(String[] args) {
        // 创建一个随机数组
        int m = 50; // 对象数组长度
        int size = 10; // 存入个数
        Student[] students = createObjectArrs(m, size);
        // 遍历
        // 统计不及格人数
        int count = 0; // 定义计数器变量
        for (int i = 0; i < size; i++) {
            System.out.println("students[i].toString() = " + students[i].toString());
            if (students[i].stuCourse < 60) {
                count++;
            }
        }
        System.out.println("count = " + count); // 不及格人的个数
        // 1 查看data数组中是否存在姓名为wangwu的同学
        students[size++] = new Student("王五", createCourse());
        String targetName = "王五";
        int isExist = isExist(size, students, targetName);
        System.out.println(isExist > 0 ? "存在" : "不存在");

        //2 从数组中删除姓名为zhaoliu的同学
        // 判断该姓名同学是否存在
        students[2].stuName = "张三";
        String deleteName = "张三";
        int isIndex = isExist(size, students, deleteName);
        System.out.println("isIndex = " + isIndex);
        if (isIndex > 0) {
            // 存在,即删除对象数组 下标为isIndex 的元素
            students = deleteObjectArr(size, students, isIndex);
            size--;  // 数组元素个数减一
            // 删除成功, 遍历展示
            for (int i = 0; i < size; i++) {
                System.out.println("students[i].toString() = " + students[i].toString());
            }
        } else {
            // 不存在不用删除
            System.out.println("不存在,不用删除");
        }
    }

    /**
     * 删除
     *
     * @param size        : 对象个数
     * @param students    : 对象数组
     * @param deleteIndex : 删除目标索引
     */
    private static Student[] deleteObjectArr(int size, Student[] students, int deleteIndex) {
        // 定义一个新数组
        Student[] smallStus = new Student[students.length];
        // 将数组 [0 , deleteIndex - 1) 复制给新数组 : deleteIndex - 1个元素
        System.arraycopy(students, 0, smallStus, 0, deleteIndex);
        // 将数组 [deleteIndex + 1 , size) 复制给新数组 size - deleteIndex - 1个元素
        System.arraycopy(students, deleteIndex + 1, smallStus, deleteIndex, size - deleteIndex - 1);
        // 将samllStu的索引值 赋值给 数组
        return smallStus;
    }

    /**
     * 判断是否存在
     *
     * @param size       : 对象个数
     * @param students   : 对象数组
     * @param targetName : 目标名字
     * @return : 返回索引值
     */
    private static int isExist(int size, Student[] students, String targetName) {
        for (int i = 0; i < size; i++) {
            if (students[i].stuName.equals(targetName)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 生成对象数组
     *
     * @param m    : 数组长度
     * @param size : 对象个数
     * @return : 返回对象数组
     */
    private static Student[] createObjectArrs(int m, int size) {
        Student[] students = new Student[m];
        for (int i = 0; i < size; i++) {
            students[i] = new Student(createName(), createCourse());
        }
        return students;
    }

    /**
     * 生成随机名字的方法
     */
    private static String createName() {
        int n = (int) (Math.random() * (4 - 2) + 2); // 随机生成名字长度
        char[] ch = {'国', '泰', '民', '安', '中', '华', '崛', '起', '繁', '容', '昌', '盛'};
        StringBuilder name = new StringBuilder();
        for (int i = 0; i < n; i++) {
            name.append(ch[(int) (Math.random() * 12)]);
        }
        return name.toString();
    }

    /**
     * 生成一个随机成绩
     */
    private static int createCourse() {
        return (int) (Math.random() * 100);
    }
}

class Student {
    // 定义实例变量
    String stuName;
    // 成绩
    double stuCourse;

    public Student() {
    }

    public Student(String stuName, double stuCourse) {
        this.stuName = stuName;
        this.stuCourse = stuCourse;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuName='" + stuName + '\'' +
                ", stuCourse=" + stuCourse +
                '}';
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/513468.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Paddle实现人脸对比

人脸对比 人脸对比&#xff0c;顾名思义&#xff0c;就是对比两个人脸的相似度。本文将用Paddle实现这一功能。 PS&#xff1a;作者肝了整整3天才稍微搞明白实现方法 数据集准备 这里使用百度AI Studio的开源数据集&#xff1a; 人脸数据_数据集-飞桨AI Studio星河社区 (b…

【React】vite + react 项目,配置项目路径别名 @

vite react 项目&#xff0c;配置项目路径别名 1 安装 types/node2 在 vite.config.ts 中添加配置&#xff1a;3 配置路径别名的提示 使用 vite 开发 react 项目时&#xff0c;可以通过一下步骤配置路径别名&#xff1a; 1 安装 types/node npm i -D types/node2 在 vite.con…

Lumos学习王佩丰Excel第一讲:认识Excel

最近发现自己在操作excel的一些特殊功能时会有些不顺手&#xff0c;所以索性找了一个比较全的教程&#xff08;王佩丰excel24讲&#xff09;拿来学习&#xff0c;刚好形成文档笔记&#xff0c;分享给有需要但没有时间看视频的朋友们。整体笔记以王老师授课的知识点去记录&#…

Spring拓展点之SmartLifecycle如何感知容器启动和关闭

Spring为我们提供了拓展点感知容器的启动与关闭&#xff0c;从而使我们可以在容器启动或者关闭之时进行定制的操作。Spring提供了Lifecycle上层接口&#xff0c;这个接口只有两个方法start和stop两个方法&#xff0c;但是这个接口并不是直接提供给开发者做拓展点&#xff0c;而…

算法基础--递推

&#x1f600;前言 递推算法在计算机科学中扮演着重要的角色。通过递推&#xff0c;我们可以根据已知的初始条件&#xff0c;通过一定的规则推导出后续的结果&#xff0c;从而解决各种实际问题。本文将介绍递推算法的基础知识&#xff0c;并通过一些入门例题来帮助读者更好地理…

力扣 392. 判断子序列

题目来源&#xff1a;https://leetcode.cn/problems/is-subsequence/description/ C题解1&#xff1a;在t中按顺序一个一个寻找s的元素。 class Solution { public:bool isSubsequence(string s, string t) {bool flg false;int m s.size(), n t.size();if(m 0) return tr…

vue项目打包优化之-productionSourceMap设置

productionSourceMap 是一个用于配置生产环境下是否生成 source map 文件的选项。在 webpack 中&#xff0c;source map 文件是一种映射关系文件&#xff0c;可以将编译后的代码映射回原始源代码&#xff0c;方便开发者在调试时定位问题。 在生产环境中&#xff0c;通常不建议暴…

线程池小项目【Linux C/C++】(踩坑分享)

目录 前提知识&#xff1a; 一&#xff0c;线程池意义 二&#xff0c;实现流程 阶段一&#xff0c;搭建基本框架 1. 利用linux第三方库&#xff0c;将pthread_creat线程接口封装 2. 实现基本主类ThreadPool基本结构 阶段二&#xff0c;完善多线程安全 1. 日志信息打印…

大模型放进推荐系统怎么玩?微软亚研全面总结

在大模型时代&#xff0c;似乎任何自然语言处理任务在大模型加持下都完成了一轮升级改造&#xff0c;展现出前所未有的高效与效果。语义理解、情感分析还是文本生成这些常规任务自然是不必说&#xff0c;但也有一些任务比如推荐&#xff0c;简单粗暴的训练LLMs的思路并非明智之…

回溯算法|78.子集

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集&#xff0c;要放在终止添加的上面&#xff0c;否则会漏掉自…

HarmonyOS 应用开发之非线性容器

非线性容器实现能快速查找的数据结构&#xff0c;其底层通过hash或者红黑树实现&#xff0c;包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种。非线性容器中的key及value的类型均满足ECMA标准。 HashMap HashMap 可用来存储具有关联…

门控循环单元(GRU)

概述 门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;由Junyoung Chung等人于2014年提出&#xff0c;原论文为《Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling》。GRU是循环神经网络&#xff08;Recurrent Neural Network, …

定时器-间歇函数

1.开启定时器 setInterval(function (){console.log(一秒执行一次)},1000) function fn(){console.log(一秒执行一次) } setInterval(fn,1000) //调用有名的函数&#xff0c;只写函数名 1.函数名字不需要加小括号 2.定时器返回是一个id数字 每个定时器的序号是不一样的 2.关…

成都直播基地出租:天府新区兴隆湖天府锋巢直播产业基地

天府新区兴隆湖天府锋巢直播产业基地&#xff0c;作为成都乃至西部地区的一颗璀璨明珠&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;吸引着越来越多的目光。这里不仅是成都直播产业的聚集地&#xff0c;更是传统企业转型升级的摇篮&#xff0c;是新媒体时代下的创新高…

浙江大学蒋超课题组合作EST:开发使用可穿戴被动采样器对个体生物和化学暴露组与转录组进行纵向测绘

我们实验室的子诺师姐开发了一种新型的用于个体生物和化学暴露组纵向测绘的可穿戴被动采样器&#xff1a;AirPie。 目前可以在一个驱蚊扣差不多大小的device上分析出数千种化合物和微生物信号&#xff0c;非常&#x1f42e;。 我们将该采样器应用于某封闭环境&#xff0c;对19…

嵌入式门槛高吗?

一般来说&#xff0c;普通的嵌入式岗位相对而言比较容易入门&#xff0c;通常会要求掌握一定的 C 语言编程以及单片机相关的知识&#xff0c;能够制作出较为简单的电子产品&#xff0c;不过与之相对应的工资水平也会偏低一些。 然而&#xff0c;像大疆、华为、小米、英伟达、高…

C++万物起源:类与对象(三)拷贝构造、赋值重载

目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中&#xff0c;我们可以将一个变量赋值给…

2024 ccfcsp认证打卡 2023 05 01 重复局面

2023 05 01 重复局面 题目题解1题解2区别&#xff1a;数据存储方式&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 总结&#xff1a; 题目 题解1 import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(Sys…

自动驾驶传感器:传感的本质

自动驾驶传感器&#xff1a;传感的本质 附赠自动驾驶学习资料和量产经验&#xff1a;链接 0. 前言 这个系列的背景是&#xff1a;工作时候需要攒一台数据采集车辆&#xff0c;那段时间需要熟悉感知硬件&#xff0c;写了不少笔记&#xff0c;都是些冗长的文章&#xff0c;感兴…

【pysurvival Python 安装失败】

这个错误与 sklearn 包的名称更改有关&#xff0c;导致 pysurvival 在构建元数据时失败。现在&#xff0c;你需要修改 pysurvival 的安装文件以使用正确的 scikit-learn 包名 编辑安装文件&#xff1a;找到 pysurvival 的安装文件&#xff0c;可能是 setup.py 或 pyproject.to…