数组Arrays,排序算法,String类,Stringbulider,正则表达式

## 数组

排序

经典的三大排序:冒泡,选择,插入

(一)冒泡排序核心 :数组中的 相邻 两项比较,交换(正序or倒序)

正序原理图:

代码实现:

java 复制代码
    public static void sort(int[] a){
        for (int i = 0; i < a.length; i++) {
            //i < a.length-1 也可以
            for (int j = 0; j < a.length-i-1; j++) {
                //-1防止数组越界
                if (a[j]>a[j+1]){//相邻
                    int temp = a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
            }
        }
    }

问题:如果数组本身有序,依然进行大量比较,但没有排序交换。

做一个开关判断

java 复制代码
package com.ffyc.Sort;

/**
 * 冒泡排序--"相邻"
 */
public class BubbleSortDemo {

    public static void sort(int[] a){
        for (int i = 0; i < a.length; i++) {//控制冒泡排序次数
            //a.length-1 也可以
            boolean f= true;//开关
            for (int j = 0; j < a.length-i-1; j++) {
                //-1防止数组越界 -i相当于优化了一下下
                if (a[j]>a[j+1]){//相邻
                    f=false;

                    int temp = a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
            }
        }
            if (f) break;
    }
}
public static void print(int[] a){
        for (int t : a){
            System.out.print(t+"\t");
        }
}

    public static void main(String[] args) {
        int[] a = {1,2,3,6};
        sort(a);
        print(a);
    }
}

(二)选择排序

核心:一次循环找出最大/小值

原理图:

代码:

//优化:减少交换次数

java 复制代码
package com.ffyc.Sort;

/**
 * 选择排序
 */

public class SelectSortDemo {
    public static void sort(int[] a){
        for (int i = 0; i < a.length; i++) {
            int min = a[i];
            int pos = i;
            for (int j = i+1 ;j <a.length ; j++) {
                if (min > a[j]){//不是最小值
                    min = a[j];
                    pos = j;//j是最小值的下标位置
                }
            }
            //找到最小值之后进行交换
            a[pos]=a[i];
            a[i]=min;

        }
    }
    public static void print(int[] a){
        for (int t : a){
            System.out.print(t+"\t");
        }
    }
    
    
    public static void main(String[] args) {
        int [] a= {4,3,6,1,8};
        sort(a);
        print(a);
    }
}

常规和优化耗时比较:

java 复制代码
 public static void sort(int[] a) {//优化
        long s1 = System.nanoTime();
        for (int i = 0; i < a.length; i++) {
            int min = a[i];
            int pos = i;
            for (int j = i + 1; j < a.length; j++) {
                if (min > a[j]) { //不是最小值
                    min = a[j];
                    pos = j;  //j是最小值位置
                }
            }
            //找到最小值之后进行交换
            a[pos] = a[i];
            a[i] = min;

        }
        long s2 = System.nanoTime();
        System.out.println("耗时1: " + (s2 - s1));
    }

    public static void sortx(int[] a) {//原始
        long s1 = System.nanoTime();
        for (int i = 0; i < a.length; i++) {
            int min = a[i];

            for (int j = i + 1; j < a.length; j++) {
                if (min > a[j]) { //不是最小值
                    min = a[j];
                    a[j] = a[i];
                    a[i] = min;
                }
            }
        }
        long s2 = System.nanoTime();
        System.out.println("耗时x: " + (s2 - s1));
    }

(三)插入排序--联想"打扑克"

覆盖过程

希尔排序

bigO表示法

O(n)

O(1)
O(n)

取平均,去掉常数;O(n/2+1)==》O(n)

O(n^2)

不一样是O(n*m)

空间复杂度稳定,

循环分开实现O(2n),比嵌套的效率高O(n2)-->O(n)<O(n2)

数组辅助类:Arrays

数组转换为字符串

Arrays**.toString**(数组)-->字符串

fill

填充,和sort一样可以选择范围

equals

copyof

数组拷贝

binarySearch

二分查找(前提:有序)

结果<0 ===》 代表没找到

数组删除问题

Arrays.copyOfRange 是Java中的一个数组操作方法,它用于复制指定数组的指定范围的元素到一个新数组中。这个方法的详细用法和示例如下:

Arrays.copyOfRange) 用法:**左闭右开** javapublic static int[] copyOfRange(int[] original, int from, int to) 参数说明: * `original`:要复制的原始数组。 * `from`:复制的起始索引(包含)。 * `to`:复制的结束索引(不包含)。 * 注:数组位置从0开始,length不是最后一个,length-1是最后一个。 ### 多维数组(二维) 本质:一维数组------看作一张表,行-列,坐标 #### 一维数组 紧紧相连,不断开;断开就成链表了 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/98012500579847728cfabb6440105d5f.png) #### 二维数组 定义:一维数组的元素是一个一维数组。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/27ae9f54359346f78497996cf49bfb77.png) int [][] a = new int[5][];//false int [][] a = new int[][5];//true java需要确定的是行(一维数组)。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/738352d097844dbb8ff99cf9a425e750.png) 打印: ​ String\[\] ball = {"●", "○"}; ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9820db401ce44d1f98ad4675fd8fc69e.png) ## String------第九大类型 能够使用String,char\[\];String不是基本类型 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a81c0dc31e9d4351abad463b4fda7351.png) ### 字符串 本质是字符数组 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a2d50c7e1d0b4427b857648c163fc6c0.png) #### 字符串长度获取 str.length #### 字符串和字符数组的转换 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a91b7f5fd0a8462591487807f33c17ae.png) ##### 问题:有一个字符串"apple",统计出现次数最多的字符。 桶排序 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/90c8dc0e751a4f4a84cde18cc754be48.png) ### Api==》接口(别人写好的) #### 常用的几个(Application Programming Interface) 1. trim:常用于从用户输入中去除(第一个字符之前的空格,最后一个字符之后空格)不必要的空格,或者验证输入是否为空。 2. toUppercase:转大写 3. toLowcase:转小写 4. c1.equalsIgnoreCase(c2));//忽略大小写比较 5. (String)s.charAt(i); //取字符串中的单个字符 6. ​ s.substring(startIndex,endIndex) : 截取字符串,\[左闭右开) 7. ​ s.spilt(字符串) : 分割字符串 8. 如果忘了:ctrl+o 找你要用的 #### indexOf()/lastIndexOf()/replace() 1. `indexOf()` 方法用于在字符串中查找指定子字符串第一次出现的位置,并返回其索引。如果未找到子字符串,则返回 -1。 2. `lastIndexOf()` 方法与 `indexOf()` 类似,但它是从字符串末尾开始搜索指定子字符串最后一次出现的位置。 3. `replace()` 方法用于在字符串中用一个新的子字符串替换匹配的子字符串(或者使用正则表达式替换)。 * `indexOf()` 和 `lastIndexOf()` 用于查找字符串中的子字符串,并返回其索引或者 `-1`(未找到)。 * `replace()` 用于将字符串中的指定子字符串(或者匹配的正则表达式)替换为新的子字符串。 #### 解析-xxx-之间的信息 ###### 法一 ```java package com.ffyc.string; public class StringApiDemo04 { public static void main(String[] args) { String str = "001-脱缰凯-男-16-班长-555.00"; int s1 = str.indexOf("-"); int s2 = str.indexOf("-", s1 + 1); int s3 = str.indexOf("-", s2 + 1); int s4 = str.indexOf("-", s3 + 1); int s5 = str.lastIndexOf("-"); //解析 名字 String s0 = str.substring(0, s1);//[截取字符)001 System.out.println(s0); String s = str.substring(s1+1, s2);//[截取字符) System.out.println(s); String ss = str.substring(s2+1, s3);//[截取字符) System.out.println(ss); String sss = str.substring(s3+1, s4);//[截取字符) System.out.println(sss); String ssss = str.substring(s4+1, s5);//[截取字符) System.out.println(ssss); //解析 薪水 String sal = str.substring(s5+1); System.out.println(sal); //递归 } } ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/12eb3e2d4d3d47cea7c27f3c7a330d2f.png) ###### 法二 的 函数 public static void parsex(String str){ String[] split = str.split("-"); for (String s : split) { System.out.println(s); } } ###### 法三函数 public static void parse(String str){ while (true) { int index = str.indexOf("-"); if (index<0){ System.out.println(str); break; } System.out.println(str.substring(0,index)); str = str.substring(index+1); } } #### 常用的API总结 | 编号 | API | 解释 | |:--:|:-----------------:|:-----------:| | 1 | .length | 长度 | | 2 | .substring(m,n) | 截取 | | 3 | .toUpperCase() | 大写 | | 4 | .toLowerCase() | 小写 | | 5 | .equals() | 等于 | | 6 | .indexOf() | 子字符串位置 | | 7 | .trim() | 去空格 | | 8 | .replace() | 替换 | | 9 | .lastIndexOf() | 从后向前 | | 10 | .spilt() | 分割 | | 11 | .toCharArrays() | 数组 | | 12 | .charAt() | 某位的字符 | | 13 | .valueOf() | 将其他类型转换为字符串 | | 14 | .endWith() | 以".jpg"结尾 | | 15 | .statrWith() | 以什么开头 | | 16 | .isEmpty() | 为空 | | 17 | .contains() | 是否存在 | | 18 | new String("abc") | 产生一个字符串 | | 19 | .replaceAll() | 替换所有 | ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9d4b77a167c84e0ca83139f96b6e16e5.png) #### String包 在java.lang包------不用引入 ##### 压缩软件可以打开包(文件夹) (D:)\>dev\>jdk8\>jre \>lib \> ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4b486df369c54caa8d8c23e1428c7ee0.png) **完全限定名** 就近原则String--》解决用这个完全限定名(下面的黄字打错了) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4dec7951695744d1afb2da0d5d29d26e.png) ##### import ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/76e5672f8d7342b49c95c564a090fdbc.png) ##### package ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9278db67de9949ec9d4e39cd3bd92307.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1733b29288204fc09333e4ccaae35e9f.png) #### 转换为字符串 ##### + ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bda27f3266794c2a81b927bc06ba16fe.png) ##### valueof ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dae2fad5ca8a411097faa3ba9330e204.png) ##### 注意区分"拼接"与"运算" ##### endwith/startwith ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8987c7d02dc24ff2a16f6f0604d61089.png) ##### isEmpty 的空 --内容空 1. 对象存在,里面(内容为空)没有字符 --isEmpty,返回t/f 2. 对象不存在 --null ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/22ce5b8ba8e84d988a7b797e32800e62.png) sum:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/76b6b033525e47ebacc36ef3ba187891.png) ##### 产生一个字符串 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9d6d96ffc9864930a951ce2beaffac59.png) 下面的是java正常使用的方法,上面是人们简写后的 #### 问题 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6f6b53d10405488ca9a7a544933515ed.png) ??? ```java ``` ### 正则表达式 #### 问题提出 判断一个数全部是数字 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3c7a06f2404c4cfe9dc621f74c2876eb.png) #### 问题解决 写一个表达式按规则完成对字符串的判定过程 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/720e491aa10b4dfbaa5ab1d621fae4a0.png) #### 应用场景 身份证 电话号码 邮箱 用户名、密码· 对字符串的特殊要求------ 电话号:1xx 4343 #### 基本表达式 一个【】只匹配一次 ##### 匹配一个数字 异或号\^ :不是xxx,表示非 [^0-9]//不是0~9的所有字符 match匹配 ##### 匹配一个字母 \[a-z

判断是否是中文

\\u4e00-\\u9fa5

java 复制代码
package com.ffyc.Regex;

/**
 * 正则表达式------单字符判断
 */
public class RegexDemo02 {
    public static void main(String[] args) {
        String s = "a";
        String n = "1";
        String regex = "[a-zA-Z]";//[]里的多个只代表一个


        System.out.println(s.matches(regex));
        System.out.println(n.matches(regex));

        //判断是否是中文 4e00~9fa5
        String chinese = "中";
        String reg = "[\u4e00-\u9fa5]";//- 表示一个范围
        System.out.println(chinese.matches(reg));
    }
}
任意字符表示------.(不加【】)

//true

匹配多个字符{n}

n:要匹配的个数,精确匹配n次

{m,n}:从m倒n位匹配

{m,}

+:至少有一次匹配

?:要么零次要么一次

问题:客户输入一个数字(浮点型,整形)

12,6565.448

问题:网站要求使用者年龄范围在18~60之间

客户:21 true

客户: 17 false

|:或者

java 复制代码
package com.ffyc.Regex;

/**
 * 18-60
 */
public class RegexPro01 {
    public static void main(String[] args) {

        String str = "19";
        /*
        分组-------------
        |:或者
        1.(18,19)
        2.(2 3 4 5 )(0-9)
        3.60
         */
        String regex = "(1[8-9])|[2-5][0-9]|(60)";
        System.out.println(str.matches(regex));
    }
}

问题:输入一个合法电话号码

1开头 ;3/8/9在第二位 ;后面几位随意

String+正则

spilt()

replaceAll()

String问题

本质-源代码-是字符数组--final--是不可以变的

复制代码
String s = Str.substring(0,5);//str,s
str = str.substring(0,5);

慢、

StringBuilder 快

删9

回文

StringBuilder版回文

改成:

reverse()

字符串反转

toString()

转换为字符串形式

力扣344 暴力法

源码

相关推荐
别来无恙✲6 分钟前
SpringBoot启动方法分析
java·springboot·场景设计
Jay_See13 分钟前
Leetcode——239. 滑动窗口最大值
java·数据结构·算法·leetcode
DKPT22 分钟前
Eclipse,MyEclipse,IDEA,Vscode这些编译器和JDK的相爱相杀
java·eclipse·编辑器·intellij-idea·myeclipse
肠胃炎24 分钟前
真题246—矩阵计数
java·线性代数·算法·矩阵·深度优先
前行的小黑炭1 小时前
设计模式:为什么使用模板设计模式(不相同的步骤进行抽取,使用不同的子类实现)减少重复代码,让代码更好维护。
android·java·kotlin
Java技术小馆1 小时前
如何设计一个本地缓存
java·面试·架构
XuanXu2 小时前
Java AQS原理以及应用
java
风象南5 小时前
SpringBoot中6种自定义starter开发方法
java·spring boot·后端
mghio14 小时前
Dubbo 中的集群容错
java·微服务·dubbo