一、背景介绍
最近在编写代码时以及在 牛客、leetcode 上刷题时,有时候会遇到需要对一个字符串进行几部分的截取 这样的需求场景。一般我都是使用 字符串 String 类自带的 split()方法 进行截取字符串,不过由于这个 split()方法 里传入的参数比较特殊,其传入的参数需要是 正则表达式 。譬如说:当前有个字符串 x = “aaa\tbbb\tccc”,我希望以 \t 为分隔符,将 x 截取,分成好几个字符串子串。如果此时使用 split()方法 截取,那么代码书写为如下形式:
public class testSplit {
public static void main(String[] args) {
String x = "aaa\tbbb\tccc";
String[] xs = x.split("\\t");
for (int i = 0; i < xs.length; i++) {
System.out.println(xs[i]);
}
}
}
输出结果:
从上面圈红框的地方,我们可以清楚的看到,split()方法 里的参数,并不是我们所指定的分隔符,是在我们指定的分隔符 \t 的基础上,又加了一个转义字符 \。这是因为 split()方法 里的参数要求必须是 正则表达式,我们所指定的分隔符 \t 在正则表达式中是表达着另一层含义的,是制表符的意思,此时就要加上转义字符,用来与正则表达式中的含义区分开来,此时的 \t 才能够真正生效。
因此使用 split()方法时,需要先对正则表达式有点了解才不至于出错,因此我通过查阅资料,找到了 StringTokenizer 类,该类同样具有与 split() 相同的效果,甚至于功能更加丰富。
二、简述 StringTokenizer 类的3个构造方法
StringTokenizer 类,其起到的作用与 split()方法 几乎一致,都是可以拿来截取字符串的。它可以跟 split() 一样自定义分隔符分割字符串,传入的参数也无需是正则表达式。当 StringTokenizer 没有指定分隔符时,其使用的是Java中默认的分隔符:空格、制表符\t、回车符\r、换页符f。
StringTokenizer 类主要有 3 个 构造方法。
1、StringTokenizer(String str)
此构造方法,其要求传入的参数是一个字符串,然后其分割字符串的方式如下:
StringTokenizer st = new StringTokenizer("aaa bbb ccc");
while(st.hasMoreElements()){
System.out.println(st.nextToken());
}
代码结果:
由于此构造方法只传入了一个字符串,没有指定分隔符,所以此时如果你传入的字符串没带有 Java 中默认的分隔符:空格、制表符\t、回车符\r、换页符\f。那么此时输出的字符串,仍旧是原样。看以下的例子:
public class testStringTokenizer {
public static void main(String[] args) {
StringTokenizer test = new StringTokenizer("aaa*bbb*ccc");
while(test.hasMoreTokens()){
System.out.println(test.nextToken());
}
}
}
输出结果:
2、StringTokenizer(String str,String delim)
此构造方法意为:在传入一个字符串的同时,还指定了分隔符。此时就可以随意指定自己想要作为分隔符的字符了,并且此分隔符无需是 正则表达式。
public static void main(String[] args) {
// 使用构造方法2,指定分隔符为 *
StringTokenizer st = new StringTokenizer("hhh*jjj*lll","*");
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
}
运行结果:
3、StringTokenizer(String str,String delim,boolean returnDelims)
此构造方法在构造方法2的基础上,加上了第3个参数,此参数的作用是:当为 true 时,表明分隔符作为一个元素返回,当为 false 时,分隔符不作为元素返回。
public static void main(String[] args) {
// 使用构造方法3,指定分隔符为 *,同时分隔符作为元素返回
StringTokenizer st = new StringTokenizer("hhh*jjj*lll","*",true);
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
}
运行结果:
三、StringTokenizer 类中的方法
掌握了 StringTokenizer 类的3种构造方法后,还需要掌握 StringTokenizer 类中的常用方法,共有5个常用方法,这5个常用方法通常会搭配 StringTokenizer 类来使用,实现截取字符串的功能。
1、int countTokens() 此方法用来计算 StringTokenizer 对象中的元素个数
public static void main(String[] args) {
// 使用构造方法2,指定分隔符为 *
StringTokenizer st = new StringTokenizer("hhh*jjj*lll","*");
int count = st.countTokens();
System.out.println(count);
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
}
运行结果:
我们指定了字符串的分隔符为 * ,因此此时通过 countTokens()方法 的计算,可知当前的 st 对象中所含元素个数为 3。
2、boolean hasMoreTokens() / boolean hasMoreElements() 这两个方法都是用来判定当前的 StringTokenizer 对象 中是否还有元素可遍历。返回 true 时,说明还有元素可遍历,返回 false 时,说明没有元素可以遍历了,此时就会退出循环。
3、Object nextElement() / boolean nextToken() 这两个方法都是用于返回对象中的一个Token (就相当于返回一个元素)