数组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(n^2)-->O(n)<O(n^2)

数组辅助类: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是最后一个。

多维数组(二维)

本质:一维数组------看作一张表,行-列,坐标

一维数组

紧紧相连,不断开;断开就成链表了

二维数组

定义:一维数组的元素是一个一维数组。

int [][] a = new int[5][];//false	
int [][] a = new int[][5];//true

java需要确定的是行(一维数组)。

打印:

​ String[] ball = {"●", "○"};

String------第九大类型

能够使用String,char[];String不是基本类型

字符串

本质是字符数组

字符串长度获取

str.length

字符串和字符数组的转换

问题:有一个字符串"apple",统计出现次数最多的字符。

桶排序

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(字符串) : 分割字符串

   如果忘了: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);
        //递归


    }
}
法二 的 函数
    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() 替换所有

String包

在java.lang包------不用引入

压缩软件可以打开包(文件夹)

(D:)>dev>jdk8>jre >lib >

完全限定名 就近原则String--》解决用这个完全限定名(下面的黄字打错了)

import
package

转换为字符串

+
valueof
注意区分"拼接"与"运算"
endwith/startwith
isEmpty 的空 --内容空
  1. 对象存在,里面(内容为空)没有字符 --isEmpty,返回t/f
  2. 对象不存在 --null

sum:

产生一个字符串

下面的是java正常使用的方法,上面是人们简写后的

问题

???

java 复制代码

正则表达式

问题提出

判断一个数全部是数字

问题解决

写一个表达式按规则完成对字符串的判定过程

应用场景

身份证

电话号码

邮箱

用户名、密码·

对字符串的特殊要求------ 电话号: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 暴力法

源码

相关推荐
Re.不晚6 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐12 分钟前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。15 分钟前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野23 分钟前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航25 分钟前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
confiself41 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
Wlq04151 小时前
J2EE平台
java·java-ee
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
豪宇刘1 小时前
SpringBoot+Shiro权限管理
java·spring boot·spring
Elaine2023911 小时前
02多线程基础知识
java·多线程