下面的代码是想要把输入的时间(hh:mm:ss)转换成秒,但在输入数据时有些问题
想要的结果是输入“11:05:18 15:14:23”后,会将两个时间均转换成秒,但实际执行时发现,输入“11:05:18 15:14:23”后,只读取了前半部分,后半部分不知道去哪了。
接着再输入“11:05:18 15:14:23”后,就是下面的结果
本以为是next()使用方法不对,但下面的代码读取结果是正确的:
想知道第一种代码,为什么没有把“11:05:18 15:14:23”分成两部分读取?
下面的代码是想要把输入的时间(hh:mm:ss)转换成秒,但在输入数据时有些问题
本以为是next()使用方法不对,但下面的代码读取结果是正确的:
想知道第一种代码,为什么没有把“11:05:18 15:14:23”分成两部分读取?
下面是我的理解,供参考:
根据参考链接,Scanner类的next()方法会读取直到换行之前的所有字符到缓冲区,然后再扫描缓冲区的字符,默认按照空格进行分隔读取字符串,后面每调用一次next()就将空格前的字符串保存到一个String对象中;
如果一次性输入:11:05:18 15:14:23,它们在第一次调用getStartTime()都被读取到缓冲区,然后按照空格进行分隔读取第一个字符串"11:05:18"保存到String对象startTime中,第二个时间因为没有被读取就被忽略了,然后第二次调用getStartTime(),创建了新的Scanner对象,不会再从上一个Scanner对象的缓冲区读取数据,所以又需要输入一次时间;
如果要将一行输入的两个时间分两次读取,可以在main()方法创建Scanner对象,然后传递给getStartTime()方法,让它们可以从同一个缓冲区读取数据即可。
修改如下:
参考链接:
package testtime;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int startTime = getStartTime(scan);
int startTime2 = getStartTime(scan);
// int startTime3 = getStartTime(scan);
// int startTime4 = getStartTime(scan);
//
System.out.println(startTime);
System.out.println(startTime2);
// System.out.println(startTime3);
// System.out.println(startTime4);
scan.close();
}
// 给getStartTime()方法新增一个Scanner参数,以便可以从同一个缓冲区数据
public static int getStartTime(Scanner scan) {
// https://blog.csdn.net/cy973071263/article/details/88908810
String startTime = scan.next();
String[] split=startTime.split(":");
int startHour = Integer.parseInt(split[0]);
int startMinute = Integer.parseInt(split[1]);
int startSecond = Integer.parseInt(split[2]);
return startHour*3600+startMinute*60+startSecond;
}
}