笔记: JavaSE day15 笔记

news2024/11/23 21:31:46

第十五天课堂笔记

数组

可变长参数★★★

  • 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 可变长参数名){}
  • 方法体 : 变长参数 相当于一个数组
  • 一个数组最多只能有一个可变长参数, 并放到列表的最后
  • 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 +
                '}';
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot实现校园周边美食探索及分享平台系统项目【项目源码+论文说明】

基于springboot实现园周边美食探索及分享平台系统演示 摘要 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#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…

vivado eFUSE 寄存器访问和编程

eFUSE 寄存器访问和编程 注释 &#xff1a; 在 MPSoC 和 Versal 器件上不支持以下 eFUSE 访问和编程方法。 7 系列、 UltraScale 和 UltraScale 器件具有一次性可编程位用于执行特定功能 &#xff0c; 称为 eFUSE 位。不同 eFUSE 位类型如 下所述&#xff1a; • …

利用Winform实现简陋版的温度计(仅供参考)

本人水平有限&#xff0c;如有写得不对的地方&#xff0c;望指正。为了简单化&#xff0c;做了一个简陋版的温度计控件&#xff0c;有点丑哈。本文的内容仅供参考 测试环境&#xff1a; visual studio 2017 .net framework 4.0 效果图如下&#xff1a; 步骤如下&#xff1a;…

SpringBoot 微服务项目,打包报错:找不到符号

错误定位到这个代码&#xff0c;调试、编译都正常&#xff0c;就打包报错 最后发现&#xff0c;这个类是其他项目里的&#xff0c;需要重新生成其他项目后&#xff0c;再来打包就行了。

dhcp中继代理

不同过路由器分配ip了&#xff0c;通过一台服务器来代替&#xff0c;路由器充当中继代理功能&#xff0c;如下图 服务器地址&#xff1a;172.10.1.1/24 配置流程&#xff1a; 1.使能dhcp功能 2.各个接口网关地址&#xff0c;配置dhcp中继功能 dhcp select relay &#xff0…

ansible-自动化工具

一、ansible概述 不是C/S架构&#xff0c;就是一种工具 1&#xff1a;linux自动化运维 编写程序实现运维自动化&#xff1a;shell python 工具模式自动化&#xff1a; ①OS Provisioning&#xff1a; RedHat satellite&#xff1b;PXE&#xff08;可实现dhcp和tftp&#…

基于深度学习的吸烟检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5等深度学习模型的吸烟行为检测系统&#xff0c;核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及…

HDLbits 刷题 --Conditional

学习: Verilog has a ternary conditional operator ( ? : ) much like C: (condition ? if_true : if_false) This can be used to choose one of two values based on condition (a mux!) on one line, without using an if-then inside a combinational always block. …

MyBatis强大的动态Sql功能

1.动态不定增加 根据需求 , 动态的拼接SQL 。 用户有的信息是必须输入&#xff0c;但有的不是必须进行输入 比如在填写注册信息的时候&#xff0c;有时候密码是一定要填写的&#xff0c;而银行卡号不是必须填写的 1)注解方式 测试类中 &#xff1a; 使用 if 标签 可以实现动…

SAP 销售订单BOM使用场景简介

SAP系统中通常会存在很多的BOM类型,有生产订单BOM、销售订单BOM、WBSBOM、标准BOM这几类。 订单BOM >= 销售BOM >= 标准BOM 订单BOM:通常是根据标准BOM基础上由PMC去调整一个物料的用量等,根据生产订单的BOM 销售BOM:根据销售订单号+行项目号创建的BOM,是根据特定…

定时器与晶振时钟、中断系统、定时中断

定时器 简介&#xff1a; C51中的定时器和计数器是同一个硬件电路支持的&#xff0c;通过寄存器配置不同&#xff0c;就可以将他当做定时器 或者计数器使用。 确切的说&#xff0c;定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时&#xff0…

一维数组oj练习(4)

又是一维数组的练习.... 小A的学号在数组中可以看成a[k]&#xff0c;在判断谁大于a[k]。大于的数用sum来统计&#xff0c;最后输出。 #include<cstdio> int a[10010],n,k,sum; int main(){scanf("%d %d",&n,&k);for(int i1;i<n;i){scanf("%d…

uniapp开发安卓跟ios所遇问题集合

Android平台配置CPU类型 一般勾选armeabi-v7a跟arm64-v8a就好了 armeabi-v7a 第7代及以上的ARM处理器&#xff08;ARM32位&#xff09;&#xff0c;市面上大多数手机使用此CPU类型。arm64-v8a 第8代、64位ARM处理器&#xff08;ARM64位&#xff09;&#xff0c;最近两年新发的…

实现顺序表的增删查改

现在让我们探索数据结构这个美妙的世界吧&#xff01; 概念介绍 线性表是具有相同特性的数据元素的有限序列。线性表是一种在实际运用中广泛运用的线性结构&#xff0c;如线性表&#xff0c;栈&#xff0c;队列&#xff0c;字符串等。 顺序表的本质是数组&#xff0c;实现了…

微信小程序使用icon图标

原因&#xff1a; 微信小程序使用fontawesome库使用icon图标&#xff0c;网上有很多教程&#xff0c;按照网上说法制作&#xff0c;引入到微信小程序中&#xff0c;但是验证成功&#xff0c;只能使用部分图标&#xff0c;结果不尽如人意。后面使用阿里巴巴开源iconfont来使用ic…

DBU-Net:用于乳腺超声图像中肿瘤分割的双分支U形网络

DBU-Net&#xff1a;用于乳腺超声图像中肿瘤分割的双分支U形网络 摘要引言材料和方法概述所提出的方法 DBU-Net Dual branch U-Net for tumor segmentation in breast ultrasound images 摘要 乳腺超声医学图像通常具有低成像质量沿着不清楚的目标边界。这些问题使得医生在诊断…

VSCode调试C++

1、环境准备 1.1、g的安装与使用 1.1.1、安装 方式一&#xff1a;Xcode安装 苹果的开发集成工具是Xcode.app&#xff0c;其中包含一堆命令行工具。 在 App store 可以看到其大小有好几个G&#xff0c;有点大。 方式二&#xff1a;Command Line Tools 安装 Command Line Too…

Ai音乐大师演示(支持H5、小程序)独立部署源码

Ai音乐大师演示&#xff08;支持H5、小程序&#xff09;独立部署源码

【开发问题】为什么Java写文件时文件名中带有“*”会写入失败呢?

前言&#xff1a;在开发过程中&#xff0c;可能会遇写文件的问题。当我们写文件时&#xff0c;文件名中可能会带“*”号。这时候可能会导致写文件失败。 比如有一段写文件的代码&#xff1a; public static void createFile(String filename, byte[] content) {FileOutputStr…