JAVA---输入输出练习(牛客)


hasNext VS hasNextLine

hasNext()(检查是否有更多的输入内容可供读取)(用于逐个读取输入中的标记(例如单词、数字)时,通常与 next() 搭配使用)(读取完标记后,光标会停留在该标记的结尾位置

hasNext() 会查看入流中是否还有下一个可用的标记(token)。一个标记通常被空格、换行符、制表符等分隔。

如果输入流中有未读的标记,hasNext() 返回 true;否则返回 false

Hello World
123 456

使用 hasNext()

  • 第一次调用 hasNext() 返回 truenext() 会返回 Hello
  • 第二次调用 hasNext() 返回 truenext() 会返回 World
  • 第三次调用 hasNext() 返回 truenext() 会返回 123
  • 第四次调用 hasNext() 返回 truenext() 会返回 456
  • 再调用 hasNext() 将返回 false

hasNextLine()(检查是否有更多的输入行可供读取)(用于逐行读取输入时,与 nextLine() 搭配使用) (读取完行内容后,光标会移到下一行的开头位置

hasNextLine() 会查看输入流中是否还有下一行。它检测是否还有一个完整的行(由换行符分隔的内容)可供读取。
如果有下一行,hasNextLine() 返回 true;否则返回 false

Hello World
123 456

使用hasNextLine()

  • 第一次调用 hasNextLine() 返回 truenextLine() 会返回 Hello World
  • 第二次调用 hasNextLine() 返回 truenextLine() 会返回 123 456
  • 再调用 hasNextLine() 将返回 false

next()和nextline()混合使用

在使用 Scanner 类时,next()nextLine() 的混合使用可能会导致一些意外行为,特别是在读取输入时,因为这两个方法的工作方式不同。

可能的问题

当你混合使用 next()nextLine() 时,可能会出现一些问题。以下是常见的场景:

Scanner scanner = new Scanner(System.in);

System.out.print("Enter your name: ");
String name = scanner.next();  // 使用 next() 读取名字

System.out.print("Enter your address: ");
String address = scanner.nextLine();  // 使用 nextLine() 读取地址

System.out.println("Name: " + name);
System.out.println("Address: " + address);
预期行为
  • 用户首先输入名字,然后按回车,程序读取并显示名字。
  • 然后用户输入地址,按回车,程序读取并显示地址。
实际行为
  • 用户输入名字,比如 John,并按回车。
  • next() 方法读取 John,光标停在 John 后面。
  • 此时,换行符仍在输入缓冲区中。
  • 当程序执行 nextLine() 时,它会读取剩余的内容(即空的换行符)并直接返回一个空字符串。

解决方法

为了避免这种情况,可以在调用 nextLine() 之前,添加一个额外的 nextLine() 来消耗掉缓冲区中的换行符:

Scanner scanner = new Scanner(System.in);

System.out.print("Enter your name: ");
String name = scanner.next();  // 使用 next() 读取名字

scanner.nextLine();  // 消耗掉上一次输入后的换行符

System.out.print("Enter your address: ");
String address = scanner.nextLine();  // 现在可以正常读取地址

System.out.println("Name: " + name);
System.out.println("Address: " + address);

总结

  • next()
  • nextLine()
  • 混合使用时,要注意 next() 不会读取换行符,因此在使用 nextLine() 之前需要手动处理换行符。

数组

一维数组

单组_一维数组

JAVA---输入输出练习(牛客)_换行符

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //方法一
        // // 注意 hasNext 和 hasNextLine 的区别
        // in.nextInt();
        // Long sum=0L;
        // while (in.hasNextInt()) { // 注意 while 处理多个 case
        //     sum+= in.nextInt();
        //     // int b = in.nextInt();
        //     // System.out.println(a + b);
        // }
        // System.out.println(sum);
        //方法二
        int count=in.nextInt();
        Long sum=0L;
        for(int i=0;i<count;i++){
            sum+=in.nextInt();
        }
        System.out.println(sum);


    }
}

多组_一维数组_T组形式

JAVA---输入输出练习(牛客)_换行符_02

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int count1 = in.nextInt();
        Long sum;
        int count2;
        for (int i = 0; i < count1; i++) {
            sum=0L;
            count2 = in.nextInt();
            for (int j = 0; j < count2; j++) {
                sum += in.nextInt();
            }
            System.out.println(sum);

        }
    }
}

二维数组

单组_二维数组

JAVA---输入输出练习(牛客)_前端_03

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int count1 = in.nextInt();
        Long sum=0L;
        int count2=in.nextInt();
        for (int i = 0; i < count1; i++) {
            for (int j = 0; j < count2; j++) {
                sum += in.nextInt();
            }

        }
        System.out.println(sum);

    }
}

多组_二维数组_T组形式

JAVA---输入输出练习(牛客)_换行符_04

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int count3 = in.nextInt();

        for (int k = 0; k < count3; k++) {
            int count1 =in.nextInt();
            Long sum = 0L;
            int count2 = in.nextInt();
            for (int i = 0; i < count1; i++) {
                for (int j = 0; j < count2; j++) {
                    sum += in.nextInt();
                }

            }
            System.out.println(sum);
        }


    }
}

字符串

单组_字符串

JAVA---输入输出练习(牛客)_java_05

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine(); // 消耗掉上一行输入后的换行符
        String s = scanner.nextLine();
        StringBuilder strBuilder=new StringBuilder(s);
        strBuilder.reverse();
        System.out.println(strBuilder);        
    }
}

多组_字符串_T组形式

JAVA---输入输出练习(牛客)_System_06

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine(); // 消耗掉上一行输入后的换行符
        for(int i=0;i<n;i++){
            scanner.nextLine(); // 消耗掉上一行输入后的换行符
            String s = scanner.nextLine();
            StringBuilder strBuilder=new StringBuilder(s);
            strBuilder.reverse();
            System.out.println(strBuilder);   
        }

     
    }
}

单组_二维字符数组

JAVA---输入输出练习(牛客)_换行符_07

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine(); // 消耗掉上一行输入后的换行符


        StringBuilder[] strBuilderArr=new StringBuilder[n];
        for(int i=0;i<n;i++){
            String s = scanner.nextLine();
            StringBuilder strBuilder=new StringBuilder(s);
            strBuilder.reverse();
            strBuilderArr[i]=strBuilder;
        }
        for(int i=n-1;i>=0;i--){
            System.out.println( strBuilderArr[i]);        
        }
       
    }
}

多组_带空格的字符串_T组形式

JAVA---输入输出练习(牛客)_前端_08

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine(); // 消耗掉上一行输入后的换行符

        for(int i=0;i<n;i++){
            scanner.nextLine();
            String s = scanner.nextLine();
            StringBuilder strBuilder=new StringBuilder();

            for(int j=0;j<s.length();j++){
                if(s.charAt(j)!=' '){
                    strBuilder.append(s.charAt(j));
                }
            }
            strBuilder.reverse();
            System.out.println(strBuilder);
        }

    }
}

格式化输出

//1. %s , %d , %.2f %c 称为占位符
//2. 这些占位符由后面变量来替换
//3. %s 表示后面由 字符串来替换
//4. %d 是整数来替换
//5. %.2f 表示使用小数来替换,替换后,只会保留小数点两位, 并且进行四舍五入的处理
//6. %c 使用 char 类型来替换

单组_保留小数位数(System.out.println 不能直接使用格式化字符串来输出带有格式的数字。应该使用 System.out.printf 或者 String.format 来实现格式化输出)

JAVA---输入输出练习(牛客)_前端_09


JAVA---输入输出练习(牛客)_System_10


JAVA---输入输出练习(牛客)_前端_11

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        double dd=in.nextDouble();
        System.out.printf("%.3f",dd);
    }
}

单组_补充前导零(%09d)

JAVA---输入输出练习(牛客)_java_12

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int num=in.nextInt();
        System.out.printf("%09d",num);
    }
}


上一篇:(WEB在线CAD)在线CAD如何实现图形识别功能


下一篇:系统架构设计师教程 第11章 11.1 信息物理系统技术概述 笔记