特殊的取最小值方法
取最小值很简单,如下所示
int min(int v1, int v2) {
return v1 < v2 ? v1 : v2;
}
这个方法一般情况都能对付,但如果 v1 和 v2 是 indexOf 方法的结果,就不适用了。
此需求是,在指定的字符串 content 中,得到指定开始串 begin 和指定结束串 end 之间的子串。在解析网页内容、或从一个大的文本内容中提取内容时,经常会有这个需求。实现也不难,如下:
String extractBetween(String content, String begin, String end) {
int pos0 = content.indexOf(begin);
if (pos0 < 0) return null;
pos0 += begin.length();
int pos1 = content.indexOf(end, pos0);
if (pos1 < 0) return null;
return content.substring(pos0, pos1);
}
然而,有时候会碰到结束特征串不确定的情况,比如 结束特征串可以是逗号,也可以是分号,甚至逗号可以是全角或半角的。所以又有了下面的需求,可以指定多个结束特征串。
String extractBetween2(String content, String begin, String end1, String end2) {
int pos0 = content.indexOf(begin);
if (pos0 < 0) return null;
pos0 += begin.length();
int pos1 = content.indexOf(end1, pos0);
int pos2 = content.indexOf(end2, pos0);
int pos = min2(pos1, pos2);
if (pos < 0) return null;
return content.substring(pos0, pos);
}
于是,就需要取 pos1 和 pos2 的最小者,但是有一种特殊情况:找不到时,它们可能是 -1。
可以对其划分成好几种情况:
1、pos1 < 0 那就是pos2了,不管它是否小于0
2、pos1 >= 0 主要考虑pos2与0或pos1的比较关系
2.1、pos1 >= 0 && pos2 < 0 结果是 pos1
2.2、pos1 >= 0 && pos2 < pos1 结果是 pos2
2.3、pos1 >= 0 && pos2 == pos1 结果是 pos2 或 pos1 皆可,反正相等
2.4、pos1 >= 0 && pos1 < pos2 此时pos2当然>0啦 结果是 pos1
用下面的表格表达起来更清晰些
# |
pos1与0比较 |
pos2与0或pos1比较 |
结果 |
1 |
pos1 < 0 |
|
pos2 |
2 |
pos1 >= 0 |
pos2 < 0 |
pos1 |
3 |
|
pos2 < pos1 |
pos2 |
4 |
|
pos2 == pos1 |
pos1 或 pos2 |
5 |
|
pos2 > pos1 |
pos1 |
实现代码如下:
int min2(int pos1, int pos2) {
return (pos1 >= 0 && (pos2 < 0 || pos1 < pos2)) ? pos1 : pos2;
}
在我的程序中,我碰到了可能有三种结束特征串
String extractBetween3(String content, String begin, String end1, String end2, String end3) {
int pos0 = content.indexOf(begin);
if (pos0 < 0) return null;
pos0 += begin.length();
int pos1 = content.indexOf(end1, pos0);
int pos2 = content.indexOf(end2, pos0);
int pos3 = content.indexOf(end3, pos0);
int pos = min3(pos1, pos2, pos3);
// log.debug("pos1=" + pos1 + " pos2=" + pos2 + " pos3=" + pos3 + " pos=" + pos);
if (pos < 0) return null;
return content.substring(pos0, pos);
}
int min3(int pos1, int pos2, int pos3) {
return min2(min2(pos1, pos2), pos3);
}
分享到:
相关推荐
C语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING....
305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)...
主要介绍了算法练习从String.indexOf的模拟实现开始,需要的朋友可以参考下
在JDK1.5中,String类增加了一个非常有用的静态函数format(String format, Objece... argues),可以将各类数据格式化为字符串并输出。其中format参数指定了输出的格式,是最复杂也是最难掌握的一点,而argues则是一...
里面包含大多数的C语言库函数源码,其中string.h中的源码最为多,希望能对大家有所帮助。
String.h函数详解 1、strcpy 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main...
使用c#的string.format 的一些常用的参数
基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用...
最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h...
使用excel表格统一管理字符串,实现String.xml 和Excel 相互转换
android 国际化 String.xml Excel 相互转换工具
String.split()方法使用总结
( String.xml转Excel翻译工具.zip....................................................................
android 字符串国际化工具 String.xml Excel 相互转换工具
public static void main(String[] args) { String haystack = "aaaaasdfasof"; String needle = "df"; char[] hs = haystack.toCharArray(); int hl = hs.length; char[] ns = needle.toCharArray(); int nl ...
标准库 - <string.h> 简介 string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
String index out of 4解决方法
js 写的string format函数,功能模仿C#中的string.Format方法,已实现(整数 :D、小数:F、货币数字:C、科学计数:E 等4种)数字格式化。参数可以传递数组,也可以传多个参数。
讲解String.xml标签在布局文件中及java代码中的引用
C#String.Format数字格式化输出 .txt