¿Puedo "empezar de nuevo", un escáner de Java?

User1291:

¿Hay una manera de hacer un escáner de comenzar desde el principio de su entrada, de nuevo?

Contexto: Me acabo de enterar de que https://adventofcode.com/ es una cosa.

La primera tarea es bastante simple (como primeras tareas son a menudo).

Que le den una serie de inicio de sesión (con el prefijo +o -) valores enteros

Es decir

-7
+16
+5
[...]

y la necesidad de añadirlos.

No es gran cosa.

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)

La segunda afirma que la entrada de tareas de lectura se repite una y otra vez y que estamos interesados en la primera totala alcanzar dos veces.

Una vez más, bastante simple:

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)

Pero una diferencia interesante entre las dos tareas es que, si bien no me importa dónde vienen los números en la primera parte, yo necesito una Filepara el segundo.

Y eso me hizo pensar. ¿Hay un "escáner wrap-around" o algo así?

¿Puedo manualmente restablecer el puntero del escáner?

O puedo encadenar Escáneres de tal manera que todo lo que el primer escáner ve (incluyendo el material que se salta por encima) se pasa a la segunda?

¿Tu sabes, ese tipo de cosas?

       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 ]

o cualquier otra cosa a lo largo de estas líneas?

Tengo el presentimiento de que no hay porque la mayor parte de todo lo que podía pensar requeriría el almacenamiento en caché de todas las entradas (que, dependiendo del tamaño de entrada, puede no ser razonable), pero todavía estoy curioso si no he pasado por alto algo .

Pavel:

Si escáner puede ser reseteado, habrá dos posibilidades:

1) Cada vez que se restablecieron, se inicia la lectura desde el archivo de nuevo. No tiene ninguna ventaja sobre la creación de uno nuevo cada vez.

2) Se guarda todos los datos leídos en la memoria RAM. Pero se puede guardar por sí mismo también. Muchas veces será más eficiente. En el caso puede almacenar enteros en lugar de cadena que ahorra memoria.

Si sólo desea o no cerca y volver a abrir el archivo cada vez, puede utilizar alguna de bajo nivel API específica de archivos como RandomAccessFile que puede restablecer usando seek(0).

La razón de que Scannerno tiene seekmétodo es que no sólo acepta el archivo, pero ninguna InputStreamcomo System.inla que no se puede leer de nuevo por diseño.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=205721&siteId=1
Recomendado
Clasificación