estoy de programación una aplicación para Android, y me gustaría que mi programa para leer una línea aleatoria de un archivo. ¿Cómo voy a hacer eso?Java - línea de lectura aleatoria
Respuesta
de hacer eso, es necesario o bien líneas de longitud fija (los detalles de implementación debería ser obvio en este caso) o información sobre el número de líneas que hay y (opcionalmente, para un mejor rendimiento) ¿A qué desplazamientos en el interior del archivo que comienzan (un índice de tipo).
los archivos pequeños, se puede crear un índice de este tipo en la demanda cada vez que necesite una línea al azar. Para hacerlo de manera eficiente para archivos de gran tamaño, debe mantener el índice de forma persistente, quizás en un archivo separado.
Si las líneas tienden a tener más o menos la misma longitud y no necesita una "aleatoriedad" perfecta, también puede elegir un desplazamiento de bytes aleatorios dentro del archivo y buscar el salto de línea más cercano.
Lo que queremos es una LineNumberReader
.
Puede usar el método setLineNumber()
para moverse a una posición aleatoria en el archivo.
LineNumberReader rdr;
int numLines;
Random r = new Random();
rdr.setLineNumber(r.nextInt(numLines));
String theLine = rdr.readLine();
+1. Esa es una respuesta mucho mejor de lo que estaba a punto de dar. No tenía idea de que la clase existía. – McStretch
@McStretch, gracias. La clase es súper útil para este tipo de operación. (Pero generalmente hay mejores clases para usar) – jjnguy
Esto definitivamente funciona, pero realmente hay que tener en cuenta que cada línea leída significa leer todas las líneas entre el principio del archivo y esa línea. –
para obtener un número aleatorio puede usar la clase Random
de java del paquete util.
Random rnd = new Random();
int nextRandomLineNumber = rnd.nextInt();
ver http://developer.android.com/reference/java/util/Random.html
El único problema que veo con esto es: no hay límites establecidos para 'Random()' – Wallter
Debería establecer los límites usando el otro método nextInt(), nextInt (int n): "Devuelve un valor int pseudoaleatorio, distribuido uniformemente entre 0 (inclusive) y el valor especificado (exclusivo), extraído de la secuencia de este generador de números aleatorios ". – McStretch
sí, solo quería mostrarle esa clase, que nextInt (int x) luego obtendría una int entre 0 y x. en el momento en que terminé mi publicación, la primera respuesta ya estaba corregida (primero solo había el comentario sobre setLineNumber sin el objeto thr random) – Lars
Una antigua usanza respuesta: Si te devuelven un valor nulo, simplemente recordar el método
BufferedReader br = new BufferedReader(file);
Random rng = new Random (8732467834324L);
String s = br.readLine();
for (; s != null ; s = br.readLine())
if (rng.nextDouble() < 0.2)
break;
br.close();
return s;
- 1. Velocidad de lectura aleatoria de Cassandra
- 2. Colección aleatoria de Java
- 3. Java aleatoria dando números negativos
- 4. ¿Cómo obtener una línea aleatoria de un archivo de texto en Java?
- 5. lectura Línea ahoga en 0x1A
- 6. ¿Cómo leo una línea aleatoria de un archivo en Python?
- 7. ¿Lees una línea aleatoria de un archivo? C#
- 8. línea de lectura por la línea de STDIN
- 9. Documentación de XCode - Lectura fuera de línea
- 10. Lectura desde System.in - Java
- 11. Lectura en Java
- 12. Cómo obtener lectura de archivo línea por línea
- 13. La lectura de un archivo línea por línea en C#
- 14. Lectura línea por línea de STDIN sin bloqueo
- 15. clojure lein (línea de lectura) stdin woes
- 16. aleatoria EXC_BAD_ACCESS con persistentStoreCoordinator
- 17. Generar fecha de nacimiento aleatoria
- 18. ¿La función aleatoria de Java puede ser cero?
- 19. Clojure (línea de lectura) no espera la entrada
- 20. Lectura y análisis de excepciones de Java
- 21. Lectura de imágenes RAW de Java
- 22. Clojure (línea de lectura) devuelve nil; no indica
- 23. Lectura de múltiples entradas desde la misma línea Scala Way
- 24. Lectura de la declaración de lectura de Fortran más allá del final de la línea
- 25. java nio líneas de lectura de un archivo
- 26. Distribución aleatoria de datos
- 27. Elección aleatoria de números
- 28. de combinación aleatoria especie
- 29. Invalidación de sesión aleatoria
- 30. Lectura de CDATA XML en Java
Ese era en realidad mi plan. ¿Podría darme más información sobre por qué las líneas deben ser de longitud fija? Solo tendré un '.txt' archivo (o .bin lo que sea). – Wallter
@Walter: si las líneas tienen la longitud fija de N bytes (¡cuidado con los problemas de codificación!) Y el archivo tiene el tamaño S, entonces hay líneas S/N y el número de línea X comienza en el desplazamiento de bytes X * N. Saltar a un desplazamiento de bytes dado en un archivo es fácil y eficiente. –
@ Michael: Eso tiene sentido - Aunque parece que es más trabajo de lo que vale, si acabas de tener una función que se ejecutó en la iniciación (o la primera línea del archivo contiene el número de líneas) – Wallter