大家好,又见面了,我是你们的朋友全栈君。
Scanner对象是一个简单的文本扫描仪,**可以使用正则解析文本字符串**。我们使用Scanner最多的地方可能就是读取键盘输入,但是Scanner的功能远比此强大。对于Scanner的进一步理解还是在LeetCode的一道算法题上,题目大意是输入一组分式加法构成的字符串,要求输出分式相加的结果。首先是输入”-2/3+2/3-4/5″,接着求其和。首先第一步需要解析字符串为所需的数据,我使用了split()的方式,有位大哥就使用了`scanner.useDelimiter(pattern)`方法,直接将数据解析到了Scaner对象中。
# Scanner的工作方式
Scanner的分隔符模式将输入分割到令牌(token,就是临时存储区域),默认情况下以**空格**分割。然后可以使用各种next方法将得到的令牌转换成不同类型的值。这种工作模式类似于String的split()方法,但Scanner更加强大。
# Scanner的应用
## 读取输入流
最常使用的是让Scanner扫描输入流。
“`
Scanner scan = new Scanner(System.in);
if (scan.hasNextLine()) {
String str = scan.nextLine();
}
scan.close();
“`
Scanner将读取输入流,并可以使用一系列的next()方法将输入流字符转化为不同类型的数值。
## 读取文件
“`
Scanner scan = null;
try {
scan = new Scanner( new File(“bin/org/xli/scanner_string/number.txt”));
while (scan.hasNext()) {
System.out.println(scan.nextDouble());
}
} catch (FileNotFoundException e) {
}
scan.close();
“`
>3.1
3.14
3.141
文件读取也是以空白分割(空格、回车、制表符都可)。
## 读取字符串
“`
Scanner scan = new Scanner(“3.1 3.14 3.141”);
while (scan.hasNextDouble()) {
System.out.println(scan.nextDouble());
}
scan.close();
“`
>3.1
3.14
3.141
## useDelimiter(pattern)方法
该方法将此扫描仪的划分模式设置为从指定的`pattern的模式`,并返回一个新的Scanner对象。
“`
String str = “1/2+1/3-1/2”;
Scanner scanner = new Scanner(str);
Scanner scan = scanner.useDelimiter(“/|\\+|(?=-)”);
while (scan.hasNextInt()) {
System.out.println(scan.nextInt());
}
scan.close();
scanner.close();
“`
>1
2
1
3
-1
2
上述代码使用`/`或`+`或`-`之前的””作为分隔符,将输入串分割为纯粹的数字,简化处理。File和InputStream类似。
**总结:使用Scanner+正则的组合可以简化很多字符串的处理,而无需使用大量的代码分割字符串和数值转换。**
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156920.html原文链接:https://javaforall.cn