改进java字符串分解的方法-java面向对象 - it电子教育门户 高端java培训.htm
来自「这是我自己认真整理的java面向对象的各个方面的知识.想和大家一起来分享我的快乐」· HTM 代码 · 共 674 行 · 第 1/3 页
HTM
674 行
to,,, \"buy, a, book\"”,分隔符是“,”。用分解器分割这个字符串时返回结果如表1所示: </DIV>
<DIV> </DIV>
<DIV>表1:字符串分解结果 </DIV>
<DIV> </DIV>
<DIV> 输入字符串包含11个逗号(,)字符,其中3个在子串里面、4个连续出现(“Today,,,”中包含两个连续逗号,第一个逗号是Today的分隔符)。下面是PowerfulTokenizer计算标记总数的算法:
</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>如果bReturnTokens=true,把子串中的分隔符数量乘以2,再从实际总数量减去该数字,就得到了标记的总数。理由是,对于子串“buy,
a,
book”,StringTokenizer将返回5个标记(即“buy:,:a:,:book”),而PowerfulTokenizer将返回一个标记(即“buy,
a, book”),两者的差值是4(即,2乘以子串中的分隔符数量)。这个公式对于所有包含分隔符的子串都有效。 </DIV>
<DIV>类似地,对于bReturnTokens=false的情形,我们从实际总数(19)减去表达式[分隔符总数(11)-
连续分隔符数量(4) +
子串中的分隔符数量(3)]。由于这时我们不返回分隔符,它们(非连续出现或在子串内部)对我们来说没有用,上面的公式为我们返回了标记的总数量(9)。
</DIV>
<DIV> 请记住这两个公式,它们是PowerfulTokenizer的核心。这两个公式适用于几乎所有它们各自条件下的情形。但是,如果你有更复杂的要求,不能使用这两个公式,那么你应该在编写代码之前分析各种可能出现的情况,并设计出自己的公式。
</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>// 检查分隔符是否位于子串之内 </DIV>
<DIV>for (int i=1; i<aiIndex.length; i++)>/td> </DIV>
<DIV>{ </DIV>
<DIV>iIndex = sInput.indexOf(sDelim, iIndex+1); </DIV>
<DIV>if (iIndex == -1) </DIV>
<DIV>break; </DIV>
<DIV>// 如果分隔符位于子串之内,则向前分析直至子串结束 </DIV>
<DIV>while (sInput.substring(iIndex-iLen,
iIndex).equals(sDelim)) </DIV>
<DIV>{ </DIV>
<DIV>iNextIndex = sInput.indexOf(sDelim, iIndex+1); </DIV>
<DIV>if (iNextIndex == -1) </DIV>
<DIV>break; </DIV>
<DIV>iIndex = iNextIndex; </DIV>
<DIV>} </DIV>
<DIV>aiIndex[i] = iIndex; </DIV>
<DIV>//System.out.println("aiIndex[" + i + "] = " + iIndex);
</DIV>
<DIV>if (isWithinQuotes(iIndex)) </DIV>
<DIV>{ </DIV>
<DIV>if (bIncludeDelim) </DIV>
<DIV>iTokens -= 2; </DIV>
<DIV>else </DIV>
<DIV>iTokens -= 1; </DIV>
<DIV>} </DIV>
<DIV>} </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> countTokens()方法检查子串是否包含双引号。如果包含,那么它减少总数并把索引值修改为字符串中下一个双引号出现的位置(如上面的代码片断所示)。如果bReturnTokens是false,那么它从总数减去输入字符串中出现的非连续分隔符的数量。
</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>// 如发现多个连续的分隔符,则返回""作为标记 </DIV>
<DIV>if ( (sPrevToken.equals(sDelim)) &&
(sToken.equals(sDelim)) ) { </DIV>
<DIV>sPrevToken = sToken; </DIV>
<DIV>iTokenNo++; </DIV>
<DIV>return ""; </DIV>
<DIV>} </DIV>
<DIV> </DIV>
<DIV>// 检查标记本身是否等于分隔符 </DIV>
<DIV>if ( (sToken.trim().startsWith("\"")) &&
(sToken.length() == 1) ) { </DIV>
<DIV>// 标记本身等于分隔符的特殊情况 </DIV>
<DIV>String sNextToken = oTokenizer.nextToken(); </DIV>
<DIV>while (!sNextToken </DIV>
<DIV>sToken += sNextToken; </DIV>
<DIV>sPrevToken = sToken; </DIV>
<DIV>iTokenNo++; </DIV>
<DIV>return sToken.substring(1, sToken.length()-1); </DIV>
<DIV>} </DIV>
<DIV>// 检查字符串中是否包含子串 </DIV>
<DIV>else if ( (sToken.trim().startsWith("\"")) </DIV>
<DIV>&& (!((sToken.trim().endsWith("\"")) </DIV>
<DIV>&& (!sToken.trim().endsWith("\"\"")))) ) </DIV>
<DIV>{ </DIV>
<DIV>if (oTokenizer.hasMoreTokens()) </DIV>
<DIV>{ </DIV>
<DIV>String sNextToken = oTokenizer.nextToken(); </DIV>
<DIV>// 检查"\"\"" </DIV>
<DIV>while (!((sNextToken.trim().endsWith("\"")) </DIV>
<DIV>&& (!sNextToken.trim().endsWith("\"\""))) )
</DIV>
<DIV>{ </DIV>
<DIV>sToken += sNextToken; </DIV>
<DIV>if (!oTokenizer.hasMoreTokens()) </DIV>
<DIV>{ </DIV>
<DIV>sNextToken = ""; </DIV>
<DIV>break; </DIV>
<DIV>} </DIV>
<DIV>sNextToken = oTokenizer.nextToken(); </DIV>
<DIV>} </DIV>
<DIV>sToken += sNextToken; </DIV>
<DIV>} </DIV>
<DIV>} </DIV>
<DIV> nextToken()方法通过StringTokenizer.nextToken方法获取标记,并检查标记中的双引号字符。如果发现了这些字符,它继续获取标记直至不能再找到带有双引号的标记。另外,它还把标记保存到一个变量(sPrevToken,参见本文后面完整的源代码)以检查连续出现的分隔符。如果nextToken()发现等同于分隔符的连续多个标记,那么它返回""(长度为0的字符串)作为标记。
</DIV>
<DIV> </DIV>
<DIV> 按照类似的方法,hasMoreTokens()方法检查已经返回的标记数量是否小于标记的总数量。 </DIV>
<DIV> </DIV>
<DIV> 【结束语】本文为你介绍了如何轻松地编写一个强大的字符串分解器。根据本文介绍的原理,你能够迅速编写出复杂的字符串分解器,节省大量的开发时间
</DIV>
<DIV> </DIV>
<DIV> </DIV></DIV></SPAN></TD></TR>
<TR>
<TD width="71%"> </TD>
<TD width="29%">【 <A
href="http://www.mldn.cn/print.jtml?articleid=272">打印</A> 】【
<A
href="http://www.mldn.cn/member/favlist.jtml?action=add&postid=272">收藏</A>
】【 <A href="http://www.mldn.cn/email.jtml?articleid=272"
target=_blank>推荐</A> 】 </TD></TR>
<TR>
<TD colSpan=2>
<TABLE cellSpacing=3 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR height=25>
<TD align=middle width="33%"><IMG height=95 alt=java视频教程
src="改进JAVA字符串分解的方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/javavideo.gif"
width=642></TD></TR>
<TR>
<TD class=content-table vAlign=top align=middle>
<TABLE>
<TBODY>
<TR>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-8-21/article_view_2251.htm"
rel=external><IMG class=midImg alt=struts2.0入门视频
src="改进JAVA字符串分解的方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/struts2.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=struts2.0入门视频
href="http://www.mldn.cn/articleview/2007-8-21/article_view_2251.htm"
rel=external>struts2.0入门视频</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-6-15/article_view_2141.htm"
rel=external><IMG class=midImg
alt=JAVAEE学习流程和学习方法
src="改进JAVA字符串分解的方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/j2eejc.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=JAVAEE学习流程和学习方法
href="http://www.mldn.cn/articleview/2007-6-15/article_view_2141.htm"
rel=external>JAVAEE学习流程和学习方..</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-6-5/article_view_2091.htm"
rel=external><IMG class=midImg
alt=1-Java介绍及JDK配置
src="改进JAVA字符串分解的方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/javase.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=1-Java介绍及JDK配置
href="http://www.mldn.cn/articleview/2007-6-5/article_view_2091.htm"
rel=external>1-Java介绍及JDK配置..</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-4-19/article_view_2012.htm"
rel=external><IMG class=midImg alt=Oracle中的多表连接
src="改进JAVA字符串分解的方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/Oracle.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=Oracle中的多表连接
href="http://www.mldn.cn/articleview/2007-4-19/article_view_2012.htm"
rel=external>Oracle中的多表连接</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-4-11/article_view_1978.htm"
rel=external><IMG class=midImg
alt=Struts中logic标签的使用
src="改进JAVA字符串分解的方法-JAVA面向对象 - IT电子教育门户 高端JAVA培训.files/struts.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=Struts中logic标签的使用
href="http://www.mldn.cn/articleview/2007-4-11/article_view_1978.htm"
rel=external>Struts中logic标签..</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2>
<TABLE cellSpacing=3 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR height=25>
<TD align=middle width="33%" bgColor=#aac4c4><FONT
color=#ffffff>相关文章</FONT></TD>
<TD align=middle width="33%" bgColor=#aac4c4><FONT
color=#ffffff>推荐文章</FONT></TD></TR>
<TR>
<TD class=content-table vAlign=top>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-1-7/article_view_287.htm"
rel=external>用JAVA做数字签名</A></TD>
<TD style="TEXT-ALIGN: right"><SPAN
class=link-Date>[1.7]</SPAN></TD></TR>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-1-7/article_view_284.htm"
rel=external>探索 Java 中的 TimeZ..</A></TD>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?