以前上课接触过Java Scanner 还做了个文法分析器,刚刚碰巧看了《Thinking in Java》关于Scanner用法,总觉得很陌生。比如说nextInt()方法是返回当前分词的int ,如果当前分词判断并非为int,那么就会报java.util.InputMismatchException。而Scanner对分词进行判断是挨个来的,Scanner的默认分词符是空字符,
假设要找出字符串s中的int类型,代码如下:
String s = "12 ab 34";
Scanner sc = new Scanner(s);
int mInt = 0;
while (sc.hasNextInt()) {
mInt = sc.nextInt();
System.out.println("mInt: " + mInt);
}
}
结果是:
mInt: 12
后面的34不会出现,原因是分词为ab的时候就退出循环了。
要得到结果:
mInt: 12
mInt: 34
把代码改为如下: 用hasNext()过滤每一个分词
String s = "12 ab 34";
Scanner sc = new Scanner(s);
int mInt = 0;
while (sc.hasNext()) {
if (sc.hasNextInt()) {
mInt = sc.nextInt();
System.out.println("mInt: " + mInt);
}
}
}
一道习题:
编写一个包含int、long、float、String属性的类,编写一个构造器,接受一个String参数。然后扫描该字符串,为各个属性赋值。
代码如下:
package pattern;
import java.util.Scanner;
public class TestScanner {
private int mInt;
private long mLong;
private float mFloat;
private String mString;
public TestScanner(String s) {
Scanner scanner = new Scanner(s);
while (scanner.hasNext()) {
if (scanner.hasNextInt()) {
mInt = scanner.nextInt();
} else if (scanner.hasNextLong()) {
mLong = scanner.nextLong();
} else if (scanner.hasNextFloat()) {
mFloat = scanner.nextFloat();
} else if (scanner.hasNext()) {
mString = scanner.next();
}
}
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "MyAttr are: " + "mInt: " + mInt + " mLong: " + mLong
+ " mFloat: " + mFloat + " mString: " + mString;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new TestScanner("0.1 899798798 khkjshf 82")
.toString());
}
}