首页 > 技术文章 > StringTokenizer使用笔记

xykjlcx 2017-05-20 11:25 原文

StringTokenizer 基本使用

  笔者最近在做算数表达式的逆波兰式转换和解析,原始表达式为String类型,在使用StringTokenizer 之前笔者的解决思路是 将原始表达式->转为字符数组存储(这里将存储 表达式的字符数组记为C1),之后 再创建一个 char类型的中介数组(记为 C2),每当C1中的元素为数字时,传递给C2,直至C1中遇到运算符,那么将中介数组(C2)存储的元素通过String.valueof(char[] age)方法转换为一个字符串存入操作数栈,这样做的缺点是 在判断过程中需要不断的在char/String 两种类型之间转换,疏忽容易出现bug,而且在每次的中介数组整体转换为String类型后,还必须重新初始化中介数组,这个过程中还会出现(空指针异常),所以笔者又Google了几篇文章,发现 使用StringTokenizer 可以完美的解决此类问题(用于单词划分,以及各种 按自定义标准分割字符串)。

 

好了,下面来 演示StringTokenizer的用法

  

 1 public class StringTokenizer_Test {
 2     
 3     public static void main(String[] args) {
 4         
 5         StringTokenizer stringTokenizer = new StringTokenizer("3+5*7");
 6         while(stringTokenizer.hasMoreTokens()){
 7             System.out.println(stringTokenizer.nextToken());
 8         }
 9         
10     }
11 
12 }

 

输出:357  

这里貌似没有起到作用,那是因为StringTokenizer有三种构造方法:

1. public StringTokenizer(String str)
2. public StringTokenizer(String str, String delim)
3. public StringTokenizer(String str, String delim, boolean returnDelims)

上例 ,我们使用的 是第一种构造方法

1. StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。
2. StringTokenizer(String str, String delim):构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符。
3. StringTokenizer(String str, String delim, boolean returnDelims):构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。

好了,我们来使用另外两种方法重新测试一下:

 1 public class StringTokenizer_Test {
 2     
 3     public static void main(String[] args) {
 4         
 5         StringTokenizer stringTokenizer = new StringTokenizer("3+5*7","+-*/");
 6         while(stringTokenizer.hasMoreTokens()){
 7             System.out.println(stringTokenizer.nextToken());
 8         }
 9         
10     }
11 
12 }

输出:

3

5

7

第二种种构造方法 以指定分割符 分割字符串 ,得到 其子字符串(子串不包含分隔符)

 

第三种方法:

 1 public class StringTokenizer_Test {
 2     
 3     public static void main(String[] args) {
 4         
 5         StringTokenizer stringTokenizer = new StringTokenizer("3+5*7","+-*/",true);
 6         while(stringTokenizer.hasMoreTokens()){
 7             System.out.println(stringTokenizer.nextToken());
 8         }
 9         
10     }
11 
12 }

输出:

3

+

5

*

7

这里可以看到,相比较 第二种方法,这里的分隔符也作为子串输出

当我们的 操作数是任意 数位时 且 字符串复杂度高时,StringTokenizer 的 作用就体现出来了(以一个带括号的 运算表达式为例):

 1 public class StringTokenizer_Test {
 2     
 3     public static void main(String[] args) {
 4         
 5         StringTokenizer stringTokenizer = new StringTokenizer("11+42*(24-15)","+-*/()",true);
 6         while(stringTokenizer.hasMoreTokens()){
 7             System.out.println(stringTokenizer.nextToken());
 8         }
 9         
10     }
11 
12 }

输出:

11

+

42

*

(

24

-

15

)

宾狗!   忘记有小伙伴 不知道

while(stringTokenizer.hasMoreTokens()){
 7             System.out.println(stringTokenizer.nextToken());
 8         }
这段代码的含义了,

这里简单介绍下:

说明:
1. 所有方法均为public;
2. 书写格式:[修饰符] <返回类型><方法名([参数列表])>
如:
static int parseInt(String s)表示:此方法(parseInt)为类方法(static),返回类型为(int),方法所需参数为String类型。

1. int countTokens():返回nextToken方法被调用的次数。如果采用构造函数1和2,返回的就是分隔符数量(例2)。
2. boolean hasMoreTokens() :返回是否还有分隔符。
3. boolean hasMoreElements() :结果同2。
4. String nextToken():返回从当前位置到下一个分隔符的字符串。
5. Object nextElement() :结果同4。
6. String nextToken(String delim):与4类似,以指定的分隔符返回结果。

 

好了,关于StringTokenizer 的用法,基本的使用就这样了,有什么问题欢迎在我的评论区反应,共同进步

推荐阅读