`
coding1688
  • 浏览: 237519 次
  • 来自: 上海
社区版块
存档分类
最新评论

与String.indexOf有关的取最小值方法

阅读更多

特殊的取最小值方法

取最小值很简单,如下所示

 

 

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);
    }
 

 

 

2
2
分享到:
评论

相关推荐

    Math、String类常用方法.zip_busy75v_hardtai

    4. `indexOf(substring)`和`lastIndexOf(substring)`:分别返回`substring`首次出现的索引和最后一次出现的索引,如果不存在则返回-1。 5. `concat(str)`:将`str`连接到原字符串的末尾。 6. `replace(oldChar, ...

    javascript函数大全

    4. **String.indexOf(searchValue[, fromIndex])**:返回在字符串中首次出现的子字符串的位置。 5. **String.lastIndexOf(searchValue[, fromIndex])**:返回在字符串中最后一次出现的子字符串的位置。 6. **String....

    day003【String类、static、Arrays类、Math类】.pdf

    - indexOf():返回指定子字符串在字符串中首次出现的位置。 - substring():返回字符串中指定开始位置到结束位置之间的子字符串。 static关键字的使用: - 静态变量:类变量,不需要实例就可以访问。 - 静态方法...

    完整word版-《JAVA语言程序设计》期末考试试题及答案5(应考必备题库).doc

    - **String.indexOf(String str)**: 返回第一次出现指定子字符串的索引。 - **String.substring(int beginIndex, int endIndex)**: 返回一个从beginIndex开始到endIndex结束的新字符串。 - **String示例**:在题目中...

    收集的一些Array及String原型对象的扩展实现代码

    这个方法与JavaScript内置的`indexOf()`方法功能相同,但在旧版本的JavaScript中可能会很有用,因为旧版本可能不支持这个内置方法。 6. **Array.prototype.removeRepeat()**: 用于移除数组中的重复项。首先对数组...

    JAVA常用类的使用方法

    常用方法有 `length()`、`charAt(int index)`、`substring(int beginIndex, int endIndex)`、`concat(String str)`、`indexOf(String str)`、`replace(char oldChar, char newChar)` 等,用于字符串操作。...

    Java由浅入深解决一道数字组合题的方案.pdf

    if (str.indexOf("0") &gt; 0) { return true; } // 统计数字1到9在字符串中的出现次数 int[] count = new int[9]; for (char c : str.toCharArray()) { count[c - '1']++; } for (int i : count) { if (i &gt; ...

    js常用技巧

    与字符串类似,数组中也可以使用 `indexOf` 和 `lastIndexOf` 方法查找元素的位置: ```javascript arr.indexOf("a", index); // 返回该字符的index,没有就返回-1,index为可选,没有就默认从0开始检索 arr....

    基于c#CP3平面网严密平差数据处理

    //三个数中的最大值:最小值 } public double atan(double y, double x)//Math.Atan2的返回值区间(-PI,PI] { double p = Math.Atan2(y, x); if (p) { return p+2*Math.PI; } else { return p; } } ...

    Java语言实用教程第课PPT教案学习.pptx

    4. 查找字符串:`indexOf()`方法用于查找子串首次出现的位置,`lastIndexOf()`查找最后一次出现的位置。 5. 截取子字符串:`substring()`方法。 6. 去掉首尾空格:`trim()`方法。 7. 替换字符或子串:`replace()`...

    javascript核心技术参考

    此文件可能包含字符串的方法,如`length`, `substring()`, `indexOf()`, `replace()`, 和模板字符串(模板字面量)等。 3. **ops.htm**: - 这个文件可能涉及JavaScript的运算符,包括算术运算符(+,-,*,/,%)...

    《JAVA程序设计》期末考试试题及答案.doc

    - **indexOf()方法**:返回指定子字符串第一次出现的位置。 - **substring()方法**:返回字符串的一个范围内的子字符串。 **应用示例:** ```java String s = "xxxxxxxxxxxxxxx#123#456#zzzzz"; int n = s.indexOf...

    JS免费课入学考试题(第五版-全日制考试) (1)1

    二、DOM/String中常用的方法和属性 1. 获取页面中&lt;div id='div1' class='box'&gt;&lt;/div&gt;元素的方法有:document.getElementById('div1')、document.querySelector('#div1.box')或document.getElementsByClassName('box'...

    Java考试题、题库、各种考试题.pdf

    - **题目背景**:利用`String`类的`indexOf()`和`substring()`方法处理字符串。 - **解答**:选项 B 正确。`indexOf()`方法返回指定字符首次出现的位置索引;`substring()`方法根据给定的起始和结束索引截取字符串的...

    常用类的方法集合

    - **语法**:`public int indexOf(String str);` - **说明**:返回当前字符串中首次出现指定子字符串的索引。如果没有找到,则返回 `-1`。 9. **获取子字符串** - **语法**:`public String substring(int ...

    Java实验报告中的实验题.pdf

    1. `String`类的方法使用,包括`length()`、`charAt()`、`substring()`、`indexOf()`等,展示了如何获取和操作字符串内容。 2. 字典查找,输入中文或英文单词,通过遍历二维数组找到对应的翻译。 实验八介绍了Java...

    Java 常用的方法

    - `indexOf()`: 查找子字符串首次出现的位置。 - `concat()`: 连接两个字符串。 - `toLowerCase()`, `toUpperCase()`: 将字符串转换为小写或大写。 - `trim()`: 去除字符串首尾的空白字符。 3. **Math类的方法*...

Global site tag (gtag.js) - Google Analytics