Java基础 - 8 - 算法、正则表达式

一. 算法

什么是算法?

        解决某个实际问题的过程和方法

学习算法的技巧?

        先搞清楚算法的流程,再直接去推敲如何写算法

1.1 排序算法

1.1.1 冒泡排序

        每次从数组中找出最大值放在数组的后面去

public class demo {public static void main(String[] args) {int[] arr = {5,2,3,1};//升序排序【1,2,3,5】//外循环控制排序轮数,内循环控制每一轮的遍历//n个数需要排序n-1轮for (int i = 0; i < arr.length - 1; i++) {//每一轮的目标是找到最大值,并放在最后一个位置//n个数 第一轮需要比较n-1次,第二轮需要比较n-2次 …… 第n-1轮需要比较1次for (int j = 0; j < arr.length - i - 1; j++) {//如果前一个数大于后一个数,则进行交换if(arr[j] > arr[j+1]){int temp;temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}System.out.println(Arrays.toString(arr));}
}

1.1.2 选择排序

        每次选择当前位置,开始找出后面的较小值与该位置交换

public class demo {public static void main(String[] args) {int[] arr = {5,1,3,2};//升序排序【1,2,3,5】selectionSort(arr);selectionSort1(arr);}//普通选择排序private static void selectionSort(int[] arr) {//外循环控制排序轮数,内循环控制每一轮的遍历//n个数需要排序n-1轮for (int i = 0; i < arr.length - 1; i++) {//每一轮的目标是确定当前位置的值(确定arr[i]的值)//j依次记录当前位置后面位置的值(要记录到最后一个位置)//如第一轮确定arr[0]的值,j应该从位置1到位置n-1(一共n个数)for (int j = i + 1 ; j < arr.length; j++) {//如果当前位置的值大于后面的值,就进行交换if(arr[i] > arr[j]){int temp;temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}System.out.println(Arrays.toString(arr));}//改进选择排序//减少交换次数,每一轮确定后面位置的最小值,再进行排序,这样每轮最多只需要交换一次private static void selectionSort1(int[] arr) {//n个数需要排序n-1轮for (int i = 0; i < arr.length - 1; i++) {//每一轮的目标是确定当前位置的值(确定arr[i]的值)//j依次记录当前位置后面位置的值(要记录到最后一个位置)//每轮确定后面位置的最小值再进行交换,用一个变量记录最小值位置的索引int minIndex = i;for (int j = i + 1 ; j < arr.length; j++) {//用minIndex记录这一轮的最小值if(arr[minIndex] > arr[j]){minIndex = j;}}//该轮最小值不是arr[i],则和最小值交换位置if(minIndex != i){int temp;temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}}System.out.println(Arrays.toString(arr));}
}

1.2 查找算法

1.2.1 顺序查找(基本查找)

注意:再数据量特别大的时候,基本查找这种从前往后挨个找的形式,性能是很差的

1.2.2 二分查找(折半查找)

        前提条件:数组中的数据必须是有序的

        核心思想:每次排除一半的数据,查询数据的性能明显提高很多

        折半条件:二分查找正常的折半条件应该是开始位置left<=结束位置right

public class demo {public static void main(String[] args) {int[] arr = {7,23,79,81,103,127,131,147};int index = binarySearch(arr,81);if(index != arr.length){System.out.println("您要找的数据在数组的索引值是"+index);}//Java中Arrays类提供了二分查找的方法System.out.println(Arrays.binarySearch(arr, 131));}public static int binarySearch(int[] arr,int data){//定义两个变量记录左右两端的位置int left = 0;int right = arr.length - 1;//定义一个循环while(left <= right){int mid = (left + right) / 2;if(arr[mid] == data){return mid;}else if(arr[mid] > data){right = mid - 1;}else{left = mid + 1;}}//循环结束,还没有找到,才会执行到这里System.out.println("未查找到"+data);return -1;}
}

二. 正则表达式

2.1 认识正则表达式 

        就是由一些特定的字符组成,代表的是一个规则

        正则表达式作用一:用来校验数据格式是否合法

        正则表达式作用二:在一段文本中查找满足要求的内容

public class demo {public static void main(String[] args) {//校验QQ号码是否正确,要求全部都是数字,长度在(6-20)之间,不能用0开头System.out.println(checkQQ(null));  //为空返回falseSystem.out.println(checkQQ("12345"));  //长度不在6-20之间返回falseSystem.out.println(checkQQ("012345"));  //0开头返回falseSystem.out.println(checkQQ("12345678abc"));  //不都是数字返回falseSystem.out.println(checkQQ("12345678"));  //trueSystem.out.println("===============================");//正则表达式校验System.out.println(checkQQ1(null));  //为空返回falseSystem.out.println(checkQQ1("12345"));  //长度不在6-20之间返回falseSystem.out.println(checkQQ1("012345"));  //0开头返回falseSystem.out.println(checkQQ1("12345678abc"));  //不都是数字返回falseSystem.out.println(checkQQ1("12345678"));  //true}//运用正则表达式//String提供了一个匹配正则表达式的方法//public boolean matches(String regex) 判断字符串是否匹配正则表达式,匹配返回true,不匹配返回falseprivate static boolean checkQQ1(String s) {return s!=null && s.matches("[1-9]\\d{5,19}");}//不运用正则表达式private static boolean checkQQ(String s) {if(s==null || s.startsWith("0") || s.length()<6 || s.length()>20){return false;}//执行到这里,说明不为空且开头不为0,长度在6-20之间//接下来要判断都是数字for (int i = 0; i < s.length(); i++) {//根据索引i提取当前位置的字符char c = s.charAt(i);if(c < '0' || c > '9'){return false;}}//执行到这里,说明都是数字return true;}
}

2.2 书写规则

public class demo {public static void main(String[] args) {// 1、字符类(只能匹配单个字符)System.out.println("a".matches("[abc]"));  // [abc]只能匹配a、b、cSystem.out.println("e".matches("[abcd]")); // falseSystem.out.println("d".matches("[^abc]"));   // [^abc] 不能是abcSystem.out.println("a".matches("[^abc]"));  // falseSystem.out.println("b".matches("[a-zA-Z]")); // [a-zA-Z] 只能是a-z A-Z的字符System.out.println("2".matches("[a-zA-Z]")); // falseSystem.out.println("k".matches("[a-z&&[^bc]]")); // : a到z,除了b和cSystem.out.println("b".matches("[a-z&&[^bc]]")); // falseSystem.out.println("ab".matches("[a-zA-Z0-9]")); // false 注意:以上带 [内容] 的规则都只能用于匹配单个字符// 2、预定义字符(只能匹配单个字符)  .  \d  \D   \s  \S  \w  \WSystem.out.println("徐".matches(".")); // .可以匹配任意字符(只能匹配单个)System.out.println("徐徐".matches(".")); // false//在Java中\是有特殊用途的,例如特殊字符 \n \t,因此希望是\的时候需要用\\// \转义System.out.println("\"");  //输出"// \n \tSystem.out.println("3".matches("\\d"));  // \d: 代表0-9System.out.println("a".matches("\\d"));  //falseSystem.out.println(" ".matches("\\s"));   // \s: 代表一个空白字符System.out.println("a".matches("\\s")); // falseSystem.out.println("a".matches("\\S"));  // \S: 代表一个非空白字符System.out.println(" ".matches("\\S")); // falseSystem.out.println("a".matches("\\w"));  // \w: [a-zA-Z_0-9]System.out.println("_".matches("\\w")); // trueSystem.out.println("1".matches("\\w")); //trueSystem.out.println("徐".matches("\\w")); // falseSystem.out.println("徐".matches("\\W"));  // [^\w]不能是a-zA-Z_0-9System.out.println("a".matches("\\W"));  // falseSystem.out.println("23232".matches("\\d")); // false 注意:以上预定义字符都只能匹配单个字符。// 3、数量词: ?   *   +   {n}   {n, }  {n, m}System.out.println("a".matches("\\w?"));   // ? 代表0次或1次System.out.println("".matches("\\w?"));    // trueSystem.out.println("abc".matches("\\w?")); // falseSystem.out.println("abc12".matches("\\w*"));   // * 代表0次或多次System.out.println("".matches("\\w*"));        // trueSystem.out.println("abc12张".matches("\\w*")); // false(\w不能匹配中文)System.out.println("abc12".matches("\\w+"));   // + 代表1次或多次System.out.println("".matches("\\w+"));       // false(+ 代表1次或多次,不能是0次)System.out.println("abc12张".matches("\\w+")); // false(\w不能匹配中文)System.out.println("a3c".matches("\\w{3}"));   // {3} 代表要正好是n次System.out.println("abcd".matches("\\w{3}"));  // false(大于3次)System.out.println("abcd".matches("\\w{3,}"));     // {3,} 代表是>=3次System.out.println("ab".matches("\\w{3,}"));     // false(小于3次)System.out.println("abcde徐".matches("\\w{3,}"));     // false(\w不能匹配中文)System.out.println("abc232d".matches("\\w{3,9}"));     // {3, 9} 代表是  大于等于3次,小于等于9次// 4、其他几个常用的符号:(?i)忽略大小写 、 或:| 、  分组:()System.out.println("abc".matches("(?i)abc")); // trueSystem.out.println("ABC".matches("(?i)abc")); // trueSystem.out.println("aBc".matches("a((?i)b)c")); // trueSystem.out.println("ABc".matches("a((?i)b)c")); // false// 需求1:要求要么是3个小写字母,要么是3个数字。System.out.println("abc".matches("[a-z]{3}|\\d{3}")); // trueSystem.out.println("ABC".matches("[a-z]{3}|\\d{3}")); // falseSystem.out.println("123".matches("[a-z]{3}|\\d{3}")); // trueSystem.out.println("A12".matches("[a-z]{3}|\\d{3}")); // false// 需求2:必须是”我爱“开头,中间可以是至少一个”编程“,最后至少是1个”666“System.out.println("我爱编程编程666666".matches("我爱(编程)+(666)+"));  //trueSystem.out.println("我爱编程编程66666".matches("我爱(编程)+(666)+"));  //false}
}

 2.3 应用案例

public class demo {public static void main(String[] args) {//checkPhone();//checkEmail();checkTime();}private static void checkPhone() {while (true) {System.out.println("请输入您的电话号码(手机|座机):");Scanner sc = new Scanner(System.in);String phone = sc.nextLine();  //nextLine()用来接收一行数据//校验手机号码的正则表达式if(phone.matches("(1[3-9]\\d{9})|(0\\d{2,3}-?[1-9]\\d{6,7})")){System.out.println("您输入的电话号码格式正确");break;}else{System.out.println("您输入的电话号码格式不正确");}}}private static void checkEmail() {while (true) {System.out.println("请输入您的邮箱:");Scanner sc = new Scanner(System.in);String phone = sc.nextLine();  //nextLine()用来接收一行数据//校验邮箱的正则表达式if(phone.matches("\\w{2,}@\\w{2,10}(\\.\\w{2,10}){1,2}")){System.out.println("您输入的邮箱格式正确");break;}else{System.out.println("您输入的邮箱格式不正确");}}}private static void checkTime() {while (true) {System.out.println("请输入需要校验的时间(xx:xx:xx):");Scanner sc = new Scanner(System.in);String phone = sc.nextLine();  //nextLine()用来接收一行数据//校验邮箱的正则表达式if(phone.matches("(([0-9])|(1[0-9])|(2[0-3]))\\:[0-5][0-9]\\:[0-5][0-9]")){System.out.println("您输入的时间格式正确");break;}else{System.out.println("您输入的时间格式不正确");}}}
}

2.4 用于查找信息

public class demo {public static void main(String[] args) {//需求:从以下内容中爬取出,手机,邮箱,座机、400电话等信息。String data = " 来学习Java,\n" +"        电话:1866668888,18699997777\n" +"        或者联系邮箱:boniu@qq.com,\n" +"        座机电话:01036517895,010-98951256\n" +"        邮箱:bozai@wosun.cn,\n" +"        邮箱:0_009@163.com,\n" +"        热线电话:400-618-9090 ,400-618-4000,4006184000,4006189090";//定义爬取规则//手机号:1开头,第二位是3-9,剩下9位是0-9//座机号:// 区号是0开头,可能是3位或4位。// -可有可无// 座机号是7或8位,不能是0开头//邮箱:必须有@,@前要有两个及以上的字符,@后要有至少2个最多10个字符,最后至少接上一组.和两个以上的字符(如123@123.com)//热线电话:400开头,后接一组3位数和一组4位数,中间的-可有可无//正则表达式中不能随意写空格,会导致结果不对String regex = "(1[3-9]\\d{9})|(0\\d{2,3}-?[1-9]\\d{6,7})|(\\w{2,}@\\w{2,10}(\\.\\w{2,10}){1,2})|(400-?\\d{3}-?\\d{4})";//把正则表达式封装成一个Pattern对象Pattern pattern = Pattern.compile(regex);//通过pattern对象去获取查找内容的匹配器对象Matcher matcher = pattern.matcher(data);//定义一个循环开始爬取信息while(matcher.find()){String rs = matcher.group();  //获取找到的内容System.out.println(rs);}}
}

 2.5 用于搜索替换、分割内容

        正则表达式用于搜索替换、分割内容,需要结合String提供的如下方法完成

方法名说明
public String replaceAll(String regex,String newStr)按照正则表达式匹配的内容进行替换
public String[] split(String regex);按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组
public class demo {public static void main(String[] args) {//public String replaceAll(String regex,String newStr)	按照正则表达式匹配的内容进行替换// 需求:请把 古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴,中间的非中文字符替换成 “-”String s = "古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴";System.out.println(s.replaceAll("\\w+", "-"));// 需求:某语音系统,收到一个口吃的人说的“我我我喜欢编编编编编编编编编编编编程程程!”,需要优化成“我喜欢编程!”。String s2 = "我我我喜欢编编编编编编编编编编编编程程程!";/*** (.) :代表一组  .用来匹配任意字符* \\1 :为这个组声明一个组号:1号    分组引用* + :声明必须是重复的字* $1 :可以去取到第1组代表的那个重复的字*/System.out.println(s2.replaceAll("(.)\\1+", "$1"));  //未接触过的知识//public String[] split(String regex);	按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组//需求:请把 古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴,中的人名获取出来。String s3 = "古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴";String[] arr = s3.split("\\w+");System.out.println(Arrays.toString(arr));}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第七篇:人工智能与机器学习技术VS量测(Measurement)- 我为什么要翻译介绍美国人工智能科技巨头IAB公司 - 它是如何赋能数字化营销生态的?

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒…

CSS的标准文档流,web后端开发框架

了解校招 知己知彼才能百战百胜&#xff0c;在准备校招之前&#xff0c;我们先要了解校招。 什么是校招&#xff1f; 校招&#xff0c;全称校园招聘&#xff0c;指企业招聘那些即将毕业的学生。校招主要分为三个部分&#xff1a;简历筛选&#xff0c;笔试&#xff0c;面试。 …

【JavaEE】_Spring MVC项目使用数组与集合传参

目录 1. 使用数组传参 1.2 传递单个参数 1.3 传递多个名称相同的参数 1.3.1 关于urlencode 2. 使用集合传参 1. 使用数组传参 创建一个Spring MVC项目&#xff0c;其中 .java文件内容如下&#xff1a; package com.example.demo.controller;import com.example.demo.Per…

C++基础2:C++基本数据类型和控制结构

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏&#xff0c;参考书籍&#xff1a;《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 2.C基本数据类型和控制结构 2.1 C基本数据类型 程序是由算法…

IP地址的使用

目录 一、简述 二、子网掩码、网关和DNS 三、IP地址的查看 1、WinXP 2、Win7 3、Win10 4、Android 四、IP地址的使用方式 无处不在的互联网&#xff0c;都是使用TCP/IP协议进行通讯的。这个协议要求参与通讯的设备都要有一个IP地址&#xff0c;比如&#xff1a;服务器、…

从零开始学习Netty - 学习笔记 -Netty入门【自定义编码器解码器】

自定义编码器解码器 通过一个简单案例&#xff0c;我们自己去实现一个编码器 和解码器 实现思路 编码器&#xff08;Encoder&#xff09;实现&#xff1a; 在编码器中&#xff0c;实现了 ByteToMessageCodec<Message> 类&#xff0c;并覆盖了 encode() 方法来处理消息的编…

浅谈 Vue3 静态提升和预字符串化

前言 很多朋友在看到 Vue3静态提升 的时候很不理解&#xff0c;不明白这句话到底是什么意思&#xff0c;今天我们就通过这篇日记来搞明白。如果有什么地方描述不正确&#xff0c;请多多指正。 静态类型&#xff08;前置信息&#xff09; 判断节点是否为静态类型&#xff0c;…

Redis 缓存机制如何提高应用程序的性能?

在数字时代&#xff0c;一拍脑门儿我们就能感觉到信息的海量和处理速度的迫切。不管是刷个微博、下个单&#xff0c;还是玩个游戏&#xff0c;我们都希望能快上加快&#xff0c;一点不拖泥带水。这时候&#xff0c;缓存技术就扮演了个大英雄的角色&#xff0c;它能让数据存取的…

Mysql80服务无法启动请输入Net helpMsg3534以获得更多的帮助

起因&情景&#xff1a; 朋友正在操作数据库&#xff0c;然后电脑突然死机&#xff0c;再重启电脑后启动数据库服务报&#xff1a; 然后朋友尝试各种操作都没有办法正常启动&#xff0c; 一、网上解决方案&#xff1a;&#xff08;先别操作&#xff09; 1 删掉&#xff1a…

基于 HBase Phoenix 构建实时数仓(1)—— Hadoop HA 安装部署

目录 一、主机规划 二、环境准备 1. 启动 NTP 时钟同步 2. 修改 hosts 文件 3. 配置所有主机间 ssh 免密 4. 修改用户可打开文件数与进程数&#xff08;可选&#xff09; 三、安装 JDK 四、安装部署 Zookeeper 集群 1. 解压、配置环境变量 2. 创建配置文件 3. 创建新…

自动化测试基础——Pytest框架之YAML详解以及Parametrize数据驱动

文章目录 一、YAML详解1.YAML作用2.YAML语法结构3.YAML数据类型3.1.对象3.2.数组3.3.标量 4.YAML的引用5.YAML类型转换 二、YAML的读写与清空1.YAML的读2.YAML的写3.YAML的清空 三、pytest的parametrize简单数据驱动四、pytest的parametrize结合yaml实现数据驱动五、解决pytest…

SprinBoot集成nacos

环境搭建 采用docker-compose搭建测试环境 # docker-compose参考&#xff1a;https://github.com/nacos-group/nacos-docker/blob/master/example/standalone-mysql-5.7.yaml # Nacos文档&#xff1a;https://nacos.io/zh-cn/index.html version: 3# 网桥 -> 方便相互通讯 …