import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
// Java 提供了 java.util.regex 包
// 它包含了 Pattern 和 Matcher 类,用于处理正则表达式的匹配操作
// 英语:Regular Expression = regex
// Pattern 与 Matcher 一起合作
// Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持
// 单独用Pattern只能使用boolean match = Pattern.matches(String regex,String input) 是一种最基础最简单的匹配
// 不如直接使用String自带的matches(String regex)方法
public class Main {
public static void main(String[] args) {
// Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建
// 即不能使用new Pattern的方法创建Pattern对象
// 可以通过Pattern.compile(String regex)这个静态方法创建一个正则表达式对象
// Java代码示例:
Pattern p1 = Pattern.compile("\\w+");
System.out.println(p1.pattern()); //返回 \w+
//pattern()返回正则表达式的字符串形式,其实就是返回Pattern.compile(String regex)的regex参数
// Pattern.split(String input)
// 用于分隔字符串,并返回一个String[]
// String.split(String regex) = Pattern.split(String input)
// Java代码示例:
Pattern p2 = Pattern.compile("\\d+");
String[] strs = p2.split("kkk123ttt456xxx");
System.out.println(Arrays.toString(strs));
// 结果:strs[0]="kkk" strs[1]="ttt" strs[2]="xxx"
// Pattern.matches(String regex,String input)
// 是一个静态方法 (指不需要创建对象,直接由类名使用)
// 用于快速匹配字符串,该方法只能一次性匹配,且匹配全部字符串
// Java代码示例:
System.out.print(Pattern.matches("\\d+", "3333") + " "); //返回true
System.out.print(Pattern.matches("\\d+", "3333aa") + " "); //返回faLse,需要匹配整个字符串
System.out.println(Pattern.matches("\\d+", "22bb33")); //返回false,需要匹配整个字符串
// Pattern.matcher(String input) 返回一个Matcher对象
// Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(String input)方法得到该类的实例
// Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作
// Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持
// Java代码示例:
Pattern p3 = Pattern.compile("\\d+");
Matcher m1 = p3.matcher("22bb33");
System.out.println(m1.pattern()); //返回p3的字符串形式,也就是返回该Matcher对象是由哪个Pattern对象的创建的
// Matcher.matches() / Matcher.lookingAt() / Matcher.find()
// Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false
// matches()对整个字符串进行匹配,只有整个字符串都匹配才返回true
// Java代码示例:
Pattern p4 = Pattern.compile("\\d+");
Matcher m2 = p4.matcher("22bb33");
System.out.print(m2.matches() + " "); //返回false
Matcher m3 = p4.matcher("3333");
System.out.println(m3.matches()); //返回true
// Pattern.matches(String regex,String input)
// Pattern.compile(regex).matcher(input).matches()
// 上述两条语句等价
// lookingAt()对开头的字符串进行匹配,只有匹配到的字符串在最前面才返回true
// Java代码示例:
Pattern p5 = Pattern.compile("\\d+");
Matcher m4 = p5.matcher("22bb33");
System.out.print(m4.lookingAt() + " "); //返回true,因为 \d+ 能匹配前面的22
Matcher m5 = p5.matcher("aa3333");
System.out.println(m5.lookingAt()); //返回false,因为 \d+ 不能匹配前面的aa
// find()对字符串进行匹配,匹配到的字符串可以在任何位置
// Java代码示例:
Pattern p6 = Pattern.compile("\\d+");
Matcher m6 = p6.matcher("22bb33");
System.out.print(m6.find() + " "); //返回true
Matcher m7 = p6.matcher("aa3333");
System.out.print(m7.find() + " "); //返回true
Matcher m8 = p6.matcher("aa3333bb");
System.out.print(m8.find() + " "); //返回true
Matcher m9 = p6.matcher("aabb");
System.out.println(m9.find()); //返回false
// Matcher.start() / Matcher.end() / Matcher.group()
// 当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信息
// start()返回匹配到的子字符串在字符串中的索引位置
// end()返回匹配到的子字符串的最后一个字符的下一个位置在字符串中的索引位置
// group()返回匹配到的子字符串
// Java代码示例:
Pattern p7 = Pattern.compile("\\d+");
Matcher m10 = p7.matcher("222xxx333");
System.out.print(m10.find() + " "); //返回true,匹配222
System.out.print(m10.start() + " "); //返回0
System.out.print(m10.end() + " "); //返回3
System.out.println(m10.group()); //返回222
System.out.print(m10.find() + " "); //返回true,匹配333
System.out.print(m10.start() + " "); //返回6
System.out.print(m10.end() + " "); //返回9
System.out.println(m10.group()); //返回333
// start(),end(),group()均有一个重载方法分别为start(int i),end(int i),group(int i)专用于分组操作
// Matcher类还有一个groupCount()用于返回有多少个组
// 捕获组
// 捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建
// 例如,正则表达式 (dog) 创建了一个单一分组,组里包含"d","o",和"g"
// 捕获组是通过从左至右计算其左括号来编号
// 例如,在表达式((A)(B(C))),有四个组:
// ((A)(B(C)))
// (A)
// (B(C))
// (C)
// 可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组
// groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组
// 还有一个特殊的组(group(0)),它总是代表整个表达式,该组不包括在 groupCount 的计数中。
// Java代码示例:
Pattern p8 = Pattern.compile("(\\D+)(\\d+)");
Matcher m11 = p8.matcher("aaa3333bb");
System.out.print(m11.find() + " "); //返回true,匹配aaa3333
System.out.print(m11.groupCount() + " "); //返回2,因为有2组,按括号分组
System.out.print(m11.group() + " "); //返回aaa3333
System.out.println(m11.group(0)); //返回aaa3333
System.out.print(m11.start(1) + " "); //返回0
System.out.print(m11.end(1) + " "); //返回3
System.out.println(m11.group(1)); //返回aaa
System.out.print(m11.start(2) + " "); //返回3
System.out.print(m11.end(2) + " "); //返回7
System.out.println(m11.group(2)); //返回3333
// 有一段文本,里面有很多数字,而且这些数字是分开的
// 现在要将文本中所有数字都提取出来
// Java代码示例:
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("QQ是:456456 电话是:123456789 邮箱是:aaa123@aaa.
Java算法题总结,供自己学习使用
需积分: 0 17 浏览量
更新于2024-02-20
收藏 55KB ZIP 举报
Java算法是程序设计的重要组成部分,它涉及到数据结构、逻辑推理和问题解决能力。这份资料集显然是为了帮助学习者深入理解并提升在Java环境下解决算法问题的能力。以下是对这些主题的详细探讨:
一、算法基础
算法是解决问题或执行任务的明确步骤描述。在Java中,我们通常使用控制流语句(如if、for、while)来编写算法。掌握算法的基础包括了解排序、搜索、图论、动态规划等核心概念。例如,快速排序、归并排序、二分查找和哈希映射都是常见的算法。
二、数据结构
数据结构是组织和存储数据的方式,对算法效率有着直接影响。Java中的数据结构主要包括数组、链表、栈、队列、集合、映射(HashMap)、树(如二叉树、红黑树)等。理解它们的工作原理和操作,比如插入、删除、查找的时间复杂度,对于优化算法至关重要。
三、递归与分治
递归是函数自我调用的过程,常用于解决复杂问题。分治策略则是将大问题分解为小问题来解决,如快速排序和归并排序就是分治的典型应用。理解和熟练运用递归与分治可以提高问题解决能力。
四、贪心算法与动态规划
贪心算法在每一步选择最优解,但不保证全局最优。而动态规划则通过存储子问题的解来避免重复计算,以达到全局最优。这两者在解决背包问题、旅行售货员问题等优化问题中广泛应用。
五、图论算法
图论算法研究图的性质和操作,如最短路径问题(Dijkstra算法、Floyd-Warshall算法)、拓扑排序、最小生成树(Prim算法、Kruskal算法)等。这些在现实世界中的网络、交通等问题中有广泛的应用。
六、字符串处理
在Java中,字符串处理也是常见算法题的一部分,如字符串匹配(KMP算法)、最长公共子序列、回文串检测等。掌握正则表达式、StringBuilder和StringBuffer的使用也是必不可少的。
七、排序与搜索
排序算法(如冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序等)和搜索算法(线性搜索、二分搜索、哈希搜索等)是基础中的基础,理解和实现这些算法对于提升编程能力非常重要。
八、Java特性在算法中的应用
Java的特性如异常处理、泛型、多线程、IO流等也能在算法实现中发挥重要作用。例如,多线程可以用于并行化计算,提高算法效率;IO流则可用于读写文件,处理大数据。
这份"Java算法题总结"资源应该包含了各种类型的题目,旨在通过实战练习提高读者的算法思维和编程技巧。通过不断练习和理解这些算法,不仅可以提升编程技能,还能在面试和实际工作中游刃有余。对于每个算法,不仅要知道其基本原理,还要理解其时间复杂度和空间复杂度,以及何时选择哪种算法。只有深入理解,才能在面对实际问题时迅速找到解决方案。

cuahai
- 粉丝: 22
最新资源
- 六自由度系统集成设计(四)PPT课件.ppt
- 生产库存与项目管理概述.pptx
- Postcat -Typescript资源
- 工业机器人现场编程实训任务测量由机器人引导的工PPT课件.pptx
- 嵌入式系统开发的最佳实践指南
- 无刷直流电机BLDC神经网络PID控制:双闭环控制模型的研究与学习指南
- 我国医院人力资源管理的信息化初探.docx
- 车载卫星通信设备及操作简介.doc
- 最新中职技能大赛Flash动画试题.pdf
- 网络支付安全知识[最终版].pdf
- GoFlyAdmin(Go语言快速开发框架)-Go资源
- 算法设计与应用作业.doc
- 山东推进农业大数据运用实施方案.doc
- TCP-IP协议在vxWorks嵌入式平台上的实现.doc
- 杭州市权力阳光电子政务系统安全技术规范.docx
- 关于铁路应急通信综合传输系统设计探讨论文.doc