我可以“重新开始” java扫描仪吗?
作者:互联网
有没有办法使扫描仪再次从其输入的起点开始?
上下文:我刚刚了解到https://adventofcode.com/是一个问题.
第一个任务很简单(就像第一个任务通常那样).
您将获得一系列带符号前缀(或-)的整数值
即
-7
+16
+5
[...]
并需要添加它们.
没什么大不了.
task01.kts
import java.util.*
val scanner = Scanner(System.`in`)
private var total = 0
while(scanner.hasNext()){
val number = scanner.nextInt()
total += number
}
println(total)
第二项任务指出,读取的输入要重复一遍又一遍,并且我们对第一个总数达到两次感兴趣.
再次,相当简单:
task02.kts
import java.util.*
import java.io.File
import Task02.Result.*
sealed class Result{
object None: Result()
data class Found(val duplicate:Int):Result()
}
if(args.size < 1) throw IllegalStateException("please provide input file as first arg")
val input = File(args[0])
private var total = 0
private val seen = mutableSetOf(0)
private var result: Result = None
while(result is None){
val scanner = Scanner(input)
while(scanner.hasNext()){
val number = scanner.nextInt()
total += number
if(seen.contains(total)){
result = Found(total)
break;
}
else seen.add(total)
}
}
println((result as Found).duplicate)
但是,这两个任务之间的一个有趣的区别是,尽管我不在乎第一部分的数字来自何处,但第二部分却需要一个文件.
这让我开始思考.是否有“环绕式扫描仪”之类的东西?
我可以手动重置扫描仪的指针吗?
还是可以链接扫描程序,使第一个扫描程序看到的所有内容(包括它跳过的内容)都传递给第二个?
你知道吗
Scanner1 Scanner2
[ O | L | L | E | H ] [ | | | | ]
[ | O | L | L | E ] [ | | | | H ]
[ | | O | L | L ] [ | | | E | H ]
[ | | | O | L ] [ | | L | E | H ]
[ | | | | O ] [ | L | L | E | H ]
[ | | | | ] [ O | L | L | E | H ]
还是这些路线上的其他东西?
我有一个预感,不是因为我能想到的大多数东西都需要缓存所有输入(取决于输入大小,可能不合理),但是我仍然很好奇我是否没有忽略某些东西.
解决方法:
如果可以重置扫描仪,则有两种可能性:
1)每次重置时,它将再次开始从文件读取.与每次创建一个新的相比,它没有任何好处.
2)将所有读取的数据保存在RAM中.但是您也可以自己保存它.通常它会更高效.在这种情况下,您可以存储整数而不是字符串,从而节省了内存.
如果您只是不想每次都关闭和重新打开文件,则可以使用一些较低级别的文件特定API,例如RandomAccessFile,可以使用seek(0)进行重置.
Scanner没有寻求方法的原因是它不仅接受文件,而且接受任何System.in这样的InputStream,而该InputStream不能被设计再次读取.
标签:java-util-scanner,io,kotlin,java 来源: https://codeday.me/bug/20191024/1924021.html