2011-01-24 33 views

Respuesta

4

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.

+0

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

+0

@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. –

+0

@ 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

8

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

+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

+0

@McStretch, gracias. La clase es súper útil para este tipo de operación. (Pero generalmente hay mejores clases para usar) – jjnguy

+0

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. –

1

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

+0

El único problema que veo con esto es: no hay límites establecidos para 'Random()' – Wallter

+0

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

+0

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

2

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;