与String.indexOf有关的取最小值方法_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 与String.indexOf有关的取最小值方法

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

 2012/4/25 17:12:29  coding1688  程序员俱乐部  我要评论(0)
  • 摘要:特殊的取最小值方法取最小值很简单,如下所示intmin(intv1,intv2){returnv1<v2?v1:v2;}这个方法一般情况都能对付,但如果v1和v2是indexOf方法的结果,就不适用了。此需求是,在指定的字符串content中,得到指定开始串begin和指定结束串end之间的子串。在解析网页内容、或从一个大的文本内容中提取内容时,经常会有这个需求。实现也不难,如下:StringextractBetween(Stringcontent,Stringbegin
  • 标签:方法

特殊的取最小值方法

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

?

?

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

?

?

发表评论
用户名: 匿名