编程语言
首页 > 编程语言> > 我可以“重新开始” java扫描仪吗?

我可以“重新开始” 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