2011-03-17 93 views
0

我之前发布了question关于如何使用Java从外部文本文件中提取前八个值。该文本文件包含前1000个素数,并且我写了一个方法来读取所述文本文件中的数据。Java从文本文件中提取随机值

我想知道如何提取八个值随机并将结果应用于另一种方法。

东西线沿线的:

read data from file; 
select eight random numbers from file; 
apply random numbers to method; 

我能够提取的第8个数字(如由多个回答我刚才的问题的解释),但我现在期待提取8个随机值- 我怎样才能做到这一点?

谢谢。

回答

4

另一种方法是:如果

List<Long> numbers = new ArrayList<Long>(); 
//here you create reader from your file 
while ((line = reader.readLine()) != null) { 
    numbers.add(Long.valueOf(number)); 
} 

Long[] selectedNumbers = new Long[8](); 
Random r = new Random(); 
for(int i = 0; i < selectedNumbers.length; i++){ 
    selectedNumbers[i] = numbers.get(r.nextInt(numbers.Size())); 
} 
//8 random numbers are in selectedNumbers array 

优点这种解决方案是,它是一个小更efective然后BalusC的答案。你可以用List替换数组当然是

+0

它们具有相同的效果。你可能打算说“高效”?也许有一百万条记录:) – BalusC 2011-03-17 00:43:26

+0

@BalusC和@drasto - 太棒了!非常感谢你的帮助,这正是我所期待的。非常感激! – MusTheDataGuy 2011-03-17 00:50:58

+0

对不起,一个问题 - 我不断收到'line'的错误。有任何想法吗? – MusTheDataGuy 2011-03-17 01:06:15

4

Collect的数字。

List<Long> numbers = new ArrayList<Long>(); 
// ... 
while ((line = reader.readLine()) != null) { 
    numbers.add(Long.valueOf(number)); 
} 

Shuffle的清单。

Collections.shuffle(numbers); 

Grab第8位。

List<Long> eightRandomNumbers = numbers.subList(0, 8); 

通过它。

someMethod(eightRandomNumbers); 
+0

谢谢,这太棒了。请问是否有任何方法将列表更改为ArrayList 而不会引发任何错误? – MusTheDataGuy 2011-03-17 00:23:26

+1

你真的想要存储素数为双? – 2011-03-17 00:25:36

+0

当然你可以,你只需要使用'Double.valueOf()'而不是'Long.valueOf'。 – 2011-03-17 00:26:30

0

你不需要把所有的数字都加到你的内部列表中,尽管1000个数字并不重要。从本质上讲,你做的是这样的:

  • 构建随机
  • 的isntance对于文件中的每一行,计算出百分比几率(0之间的双和1)的你“需要”这个数字(有效,仍然需要的项目数量除以文件中剩余的项目数量);
  • call nextDouble()om您的随机实例:如果该double值小于您计算的百分比概率,则将该值添加到您的列表中;
  • 如果您随后需要随机选择的数字,请按照某些答案中的指示,在您选择的数字列表中调用Collections.shuffle()。

如果有任何帮助,我以前用示例代码编写了关于此主题的文章:请参阅how to pick a random sample from a list