我有一个包含姓名的大文本文件。
目标是生成随机名称(文件中的两个随机名称)。
考虑到该文件有大约8k行,每行一个名称,尝试从该文件中获取随机行是否有效处理器?这是一个漫长的过程,因此无法在运行时使用吗?
我计划使用以下方法获取随机名称
public static String choose(File f) throws FileNotFoundException
{
String result = null;
Random rand = new Random();
int n = 0;
for(Scanner sc = new Scanner(f); sc.hasNext(); )
{
++n;
String line = sc.nextLine();
if(rand.nextInt(n) == 0)
result = line;
}
return result;
}
对此代码的新手分析让我觉得它在 O(n)时间内运行
但是我用较少数量的字符串测试它(原始文件目前尚未完成,大约150个名称用于测试目的)。
这是生成随机名称的有效方法吗?
@Edit
效率很重要,考虑到我想在很短的时间内生成名称。
答案 0 :(得分:5)
这取决于您是否要重复使用您的函数(生成许多随机名称)。 如果不是,则在文件大小内生成随机数,跳到相应的字节,找到以get行结束的最近行。
有关'RandomAccessFle'的帮助,请检查: https://bitsofinfo.wordpress.com/2009/04/15/how-to-read-a-specific-line-from-a-very-large-file-in-java/
如果你需要生成许多随机名称,请将整个文件读取到一个ArrayList(8k远不多)。
-------修改了btilly的想法
要覆盖无偏见的文件,请在文件末尾添加10个foobar名称,如果选择了该名称,则重复该过程。