我有一个放入数组的txt文件。 txt文件中的数据格式为:
Order # Date Name City State Zip Code
跨越一行,每个项目代表一列。
然后还有1000多行用答案填写。我想随机选出其中的5行。出于某种原因,它只打印出第一行(订单号,日期等)。
这是我的代码:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class Rewards {
public static void main(String[] args) throws FileNotFoundException {
String fileName = ("C:/Users/Jordan/Desktop/Project5Text.txt");
FileReader fin = new FileReader(fileName);
Scanner src = new Scanner(fin);
ArrayList<String> lines = new ArrayList<String>();
src.useDelimiter(":");
while (src.hasNext()) {
lines.add(src.nextLine());
System.out.println(src.next());
}
System.out.println(lines);
String[] lineArray = new String[lines.size()];
lines.toArray(lineArray);
{
for (int i = 0; i < 5; i++) {
String random = (lineArray[new Random().nextInt(lineArray.length)]);
System.out.println("Random Winner is " +random);
}
}
}
}
以下是我正在使用的一些文本文件。
Order # Date First name Middle Initial Last name Address City State Zip Email Transaction Amount
1 8/26/2012 Kristina H Chung 947 Martin Ave. Muncie CA 46489 khchung@business.com $593
2 11/16/2012 Paige H Chen 15 MainWay Rd. Dallas HI 47281 phchen@business.com $516
3 11/10/2012 Sherri E Melton 808 Washington Way Brazil CA 47880 semelton@business.com $80
4 9/20/2012 Gretchen I Hill 56 Washington Dr. Atlanta FL 47215 gihill@business.com $989
5 3/11/2012 Karen U Puckett 652 Maplewood Ct. Brazil FL 46627 kupuckett@business.com $826
6 7/4/2012 Patrick O Song 679 MainWay Rd. Lafayette GA 47161 posong@business.com $652
以下是我正在使用的一些文本文件。
订单#日期名字中间名首字母姓名地址城市州邮编电子邮件交易金额
1 8/26/2012 Kristina H Chung 947 Martin Ave. Muncie CA 46489 khchung@business.com $ 593
2 11/16/2012 Paige H Chen 15 MainWay Rd。 Dallas HI 47281 phchen@business.com $ 516
3 11/10/2012 Sherri E Melton 808 Washington Way Brazil CA 47880 semelton@business.com $ 80
4 9/20/2012 Gretchen I Hill 56华盛顿亚特兰大佛罗里达大学47215 gihill@business.com 989美元
5 3/11/2012 Karen U Puckett 652 Maplewood Ct。巴西FL 46627 kupuckett@business.com $ 826
6 7/4/2012 Patrick O Song 679 MainWay Rd。 Lafayette GA 47161 posong@business.com $ 652
答案 0 :(得分:0)
您的代码中存在多个问题:
(1)扫描循环错误
在每次迭代中,您都在调用src.next()
进行调试输出。但是这将读到下一个出现的':',它不包含在您的文件中,因此读取完整的文件。下一次迭代没有任何剩余。
解决方案:移除对src.next()
的附加电话:
while (src.hasNextLine()) {
lines.add(src.nextLine());
}
可能你必须在循环中做一些测试以排除空行等。
提示:调试代码通常有助于找到这样的问题!
(2)您没有重复使用Random
生成器
您正在循环的每次迭代中创建一个新的Random
生成器,而不是在循环之前创建一个并重用它。 Random
的默认构造函数使用当前系统时间(System.currentTimeMillis()
)作为种子,因此如果您在(几乎)同时创建多个实例,它们将产生相同的'不是这样的序列' -random-any-more'数字。 (请注意,在某些系统上,System.currentTimeMillis()
没有真正的毫秒分辨率。)
解决方案:创建Random
的一个实例并重复使用它:
Random random = new Random();
for (int i = 0; i < 5; i++) {
String winner = (lineArray[random.nextInt(lineArray.length)]);
System.out.println("Random Winner is " + winner);
}
请注意,这并不一定意味着您不会两次获得两条线 - 就像您总是将球放回彩票中的桶中一样。相反,您应该从列表中删除该行,以确保它不会影响下一次迭代的结果。
(3)标题行包含在您的搜索结果中
通常,您不希望奖励标题行,因此要么将其从列表中删除,要么确保无法选择它:
String winner = (lineArray[1 + random.nextInt(lineArray.length - 1)]);
答案 1 :(得分:0)
试试这个:
public static void main(String[] args) throws FileNotFoundException {
String fileName = ("test.txt");
FileReader fin = new FileReader(fileName);
Scanner src = new Scanner(fin);
ArrayList<String> lines = new ArrayList<String>();
src.useDelimiter(":");
int nChoices = 3;
Random rand = new Random();
while (src.hasNext()) {
String l = src.nextLine();
if (!l.equals("")) // So we don't add blank lines
lines.add(l);
}
// System.out.println(lines.size());
String[] randomChoices = new String[nChoices]; // Number of random choices
for (int i = 0; i < randomChoices.length; i++) {
// Here makes the random choice, starting from line 1
String randomString = lines.get(1 + rand.nextInt(lines.size() - 1));
randomChoices[i] = randomString;
}
for (String s : randomChoices)
System.out.println(s);
}