2011-01-24 38 views

Trả lời

4

Để làm điều đó, bạn cần một trong hai điện thoại cố định có độ dài (các chi tiết thực hiện nên được rõ ràng trong trường hợp đó) hoặc thông tin về bao nhiêu dòng có và (tùy chọn, cho hiệu suất tốt hơn) vào những gì offsets bên trong tập tin chúng bắt đầu (một chỉ mục các loại).

Đối với các tệp nhỏ, bạn có thể tạo chỉ mục theo yêu cầu bất cứ khi nào bạn cần một dòng ngẫu nhiên. Để làm điều đó một cách hiệu quả cho các tệp lớn, bạn cần giữ cho chỉ mục xung quanh liên tục, có lẽ trong một tệp riêng biệt.

Nếu các đường có chiều dài gần bằng nhau và bạn không cần "ngẫu nhiên" hoàn hảo, bạn cũng có thể chọn một khoảng bù byte ngẫu nhiên bên trong tệp và quét ngắt dòng gần nhất.

+0

Đó thực sự là kế hoạch của tôi. Bạn có thể cho tôi biết thêm thông tin về lý do tại sao các dòng phải được cố định chiều dài? Tôi sẽ chỉ có một '.tập tin txt' (hoặc .bin bất cứ điều gì). – Wallter

+0

@Walter: Nếu các dòng có độ dài cố định N byte (các vấn đề mã hóa phần mềm!) Và tệp có kích thước S, thì có các dòng S/N và dòng X bắt đầu tại byte bù đắp X * N. Nhảy đến một byte bù đắp trong một tập tin là cả hai dễ dàng và hiệu quả. –

+0

@ Michael: Điều đó có ý nghĩa - Mặc dù điều đó có vẻ như nhiều công việc hơn giá trị của nó, Nếu bạn vừa có một hàm chạy ở điểm khởi đầu (hoặc có dòng đầu tiên trong tệp chứa số dòng) – Wallter

8

Điều bạn muốn là LineNumberReader.

Bạn có thể sử dụng phương pháp setLineNumber() để chuyển đến vị trí ngẫu nhiên trong tệp.

LineNumberReader rdr; 
int numLines; 
Random r = new Random(); 
rdr.setLineNumber(r.nextInt(numLines)); 
String theLine = rdr.readLine(); 
+1

+1. Đó là một câu trả lời tốt hơn nhiều so với tôi chuẩn bị đưa ra. Tôi không biết lớp đó tồn tại. – McStretch

+0

@McStretch, cảm ơn. Lớp này cực kỳ hữu ích cho loại hoạt động này. (Nhưng thường có các lớp học tốt hơn để sử dụng) – jjnguy

+0

Điều này chắc chắn hoạt động nhưng bạn thực sự phải ghi nhớ rằng mỗi dòng đọc có nghĩa là đọc tất cả các dòng giữa đầu của tập tin và dòng đó. –

1

để có được số ngẫu nhiên, bạn có thể sử dụng lớp học Random của java từ gói util.

Random rnd = new Random(); 
int nextRandomLineNumber = rnd.nextInt(); 

thấy http://developer.android.com/reference/java/util/Random.html

+0

Vấn đề duy nhất tôi thấy với điều này là: không có giới hạn nào được đặt cho 'Ngẫu nhiên()' – Wallter

+0

Bạn sẽ thiết lập giới hạn bằng cách sử dụng phương thức nextInt() khác, nextInt (int n): "Trả về một pseudorandom, giá trị int phân bố đều giữa 0 (bao gồm) và giá trị được chỉ định (độc quyền), được rút ra từ chuỗi trình tạo số ngẫu nhiên này. " – McStretch

+0

vâng, tôi chỉ muốn cho anh ta thấy rằng lớp học, mà nextInt (int x) sau đó ông sẽ nhận được một int giữa 0 và x. tại thời điểm tôi hoàn thành bài viết của tôi, câu trả lời đầu tiên đã được sửa chữa (đầu tiên chỉ có bình luận về setLineNumber mà không có đối tượng ngẫu nhiên thr) – Lars

2

Một câu trả lời kiểu cũ: Nếu bạn lấy lại một null, chỉ nhớ lại phương pháp

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;