Java中的Scanner(详解常见用法)

Java中的Scanner(详解常见用法)OJ中遇到的问题和例子:doublenextDouble(),floatnextFloat(),intnextInt()等与nextLine()连用时都存在遗留的换行符影响nextLine()读取输入的问题,解决的办法是:在每一个next()、nextDouble()、nextFloat()、nextInt()等语句之后加一个nextLine()语句,将被next()去掉的…

大家好,又见面了,我是你们的朋友全栈君。

OJ中遇到的问题和例子:

double nextDouble() , float nextFloat() , int nextInt() 等与nextLine()连用时都存在遗留的换行符影响nextLine()读取输入的问题,解决的办法是:在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉

import java.util.Scanner;    
public class Main {    
    public static void main(String[] args) {    
        Scanner in = new Scanner(System.in);    
        while (in.hasNext()) {    
            int n = in.nextInt();   
        /* nextLine()是扫描器执行当前行,并返回跳过的输入信息,特别需要注意!!! 

            如果没有该行,则执行第一个in.nextLine()命令时的返回值是int n = in.nextInt()的值*/   
            in.nextLine();  
        HashSet<String> set = new HashSet<String>();  
        for (int i = 0; i < n; i++) {   
        String line =   

        in.nextLine();   
        String[] arr = line.split(" ");   
        for (int j = 0; j < arr.length; j++) {   
            set.add(arr[j]);   
        }  
         }  
        System.out.println("sum:" + set.size());    

    }    
}  

一、扫描控制台输入



这个例子是常常会用到,但是如果没有Scanner,你写写就知道多难受了。


当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。




/** 
* 扫描控制台输入 
*/
 
public class TestScanner { 
        public static void main(String[] args) { 
                Scanner s = new Scanner(System.in); 
                System.out.println(“请输入字符串:”); 
                while (true) { 
                        String line = s.nextLine(); 
                        if (line.equals(“exit”)) break
                        System.out.println(“>>>” + line); 
                } 
        } 
}




请输入字符串: 
234 
>>>234 
wer 
>>>wer 
bye 
>>>bye 
exit 

Process finished with exit code 0





二、如果说Scanner使用简便,不如说Scanner的构造器支持多种方式,构建Scanner的对象很方便。




可以从字符串(Readable)、输入流、文件等等来直接构建Scanner对象,有了Scanner了,就可以逐段(根据正则分隔式)来扫描整个文本,并对扫描后的结果做想要的处理。




三、Scanner默认使用空格作为分割符来分隔文本,但允许你指定新的分隔符




使用默认的空格分隔符:


        public static void main(String[] args) throws FileNotFoundException { 
                Scanner s = new Scanner(“123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf    ……asdfkl    las”); 
//                s.useDelimiter(” |,|\\.”); 
                while (s.hasNext()) { 
                        System.out.println(s.next()); 
                } 
        }





123 
asdf 
sd 
45 
789 
sdf 
asdfl,sdf.sdfl,asdf 
……asdfkl 
las 

Process finished with exit code 0




将注释行去掉,使用空格或逗号或点号作为分隔符,输出结果如下:


123 
asdf 
sd 
45 
789 
sdf 
asdfl 
sdf 
sdfl 
asdf 

asdfkl 
las 
Process finished with exit code 0






四、一大堆API函数,实用的没几个




(很多API,注释很让人迷惑,几乎毫无用处,这个类就这样被糟蹋了,启了很不错的名字,实际上做的全是龌龊事)




下面这几个相对实用:




delimiter() 
          返回此 Scanner 当前正在用于匹配分隔符的 Pattern。
hasNext() 
          判断扫描器中当前扫描位置后是否还存在下一段。(原APIDoc的注释很扯淡)
hasNextLine() 
          如果在此扫描器的输入中存在另一行,则返回 true。
next() 
          查找并返回来自此扫描器的下一个完整标记。
nextLine() 
          此扫描器执行当前行,并返回跳过的输入信息。







五、逐行扫描文件,并逐行输出




看不到价值的扫描过程


        public static void main(String[] args) throws FileNotFoundException { 
                InputStream in = new FileInputStream(new File(“C:\\AutoSubmit.java”)); 
                Scanner s = new Scanner(in); 
                while(s.hasNextLine()){ 
                        System.out.println(s.nextLine()); 
                } 
        }




public class AutoSubmit { 
  /** 
    * @param args 
    * @throws Exception    
    */ 
  public static void main(String[] args) throws Exception { 

…在此省略N行 

Process finished with exit code 0





Java对字符串支持还是比较弱的,尽管Java一直在努力。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156998.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WinHTTP如何处理Cookie

    WinHTTP如何处理CookieCookieHandlinginWinHTTPHTTPsessiondataispassedbetweentheclientandserverinthecookieheaderoftherequestortheresponse.TheserversendscookiestotheclientintheSet-cookiehe

    2022年7月11日
    19
  • 使用 SQL Server 的 uniqueidentifier 字段类型[通俗易懂]

    使用 SQL Server 的 uniqueidentifier 字段类型[通俗易懂]SQLServer自2008版起引入了 uniqueidentifier 字段,它存储的是一个UUID,或者叫GUID,内部存储为16个字节。SQLServer可用两个函数来生成 uniqueidentifier,分别是 NEWID() 和 NEWSEQUENTIALID(),后者只能用作字段的默认值。Java也有一个UUID工具类 java.uti.UUID, U…

    2025年10月3日
    4
  • XSD文件结构详解「建议收藏」

    XSD文件结构详解「建议收藏」XSD(xmlSchemaDefinition)XmlSchema的用途1.  定义一个Xml文档中都有什么元素2.  定义一个Xml文档中都会有什么属性3.  定义某个节点的都有什么样的子节点,可以有多少个子节点,子节点出现的顺序4.  定义元素或者属性的数据类型5.  定义元素或者属性的默认值或者固定值XmlSchema的根元素:&lt;?xmlversion="1.0"?&gt;…

    2025年7月25日
    2
  • maven中web3sdk引入问题

    maven中web3sdk引入问题

    2021年3月12日
    197
  • spring 整合 mybatis原理

    spring 整合 mybatis原理SqlSessionFactoryBean的创建1.SqlSessionFactoryBean这个类实现了三个接口,一个是InitializingBean,另一个是FactoryBean,还有就是ApplicationListener接口。下面说明一下实现了这三个接口的,有什么作用InitializingBean接口:实现了这个接口,那么当bean初始化的时候,spring就会调用该接口的实现…

    2022年6月3日
    45
  • pytest fixtures_pytest allure

    pytest fixtures_pytest allurefixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

    2022年7月29日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号