0

我有一个放入数组的 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 2012 年 8 月 26 日 Kristina H Chung 947 Martin Ave. Muncie CA 46489 khchung@business.com 593 美元

2 2012 年 11 月 16 日 Paige H Chen 15 MainWay Rd. 达拉斯 HI 47281 phchen@business.com 516 美元

3 2012 年 11 月 10 日 Sherri E Melton 808 Washington Way Brazil CA 47880 semelton@business.com 80 美元

4 2012 年 9 月 20 日 Gretchen I Hill 56 Washington Dr. Atlanta FL 47215 gihill@business.com 989 美元

5 2012 年 3 月 11 日凯伦 U Puckett 652 Maplewood Ct. 巴西 FL 46627 kupuckett@business.com $826

6 2012 年 7 月 4 日帕特里克 O 松 679 MainWay Rd. 老佛爷 GA 47161 posong@business.com $652

4

2 回答 2

0

您的代码中有多个问题:

(1) 扫描循环错误

在每次迭代中,您都需要src.next()调试输出。但这将读取到下一次出现的“:”,它不包含在您的文件中,因此会读取完整的文件。下一次迭代没有任何剩余。

解决方案:删除额外的调用src.next()

while (src.hasNextLine()) {
    lines.add(src.nextLine());
}

可能您必须在循环内进行一些测试以排除空行等。

提示:调试代码通常有助于发现这样的问题!

(2) 你没有重用Random生成器

您正在循环的每次迭代中创建一个新的Random生成器,而不是在循环之前创建一个并重用它。的默认构造函数Random使用当前系统时间 ( System.currentTimeMillis()) 作为种子,因此如果您(几乎)同时创建多个实例,它们都将产生相同的“不再随机”数字序列。(请注意,在某些系统上,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)]);
于 2013-11-10T17:38:31.337 回答
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);

}
于 2013-11-10T17:56:59.490 回答