【问题标题】:Lottery Program (ArrayList)彩票程序(ArrayList)
【发布时间】:2015-11-26 06:17:14
【问题描述】:

我目前正在开发一个模仿彩票的程序,并从 File 文件中读取以下信息:

5
Durant Kevin
1 15 19 26 33 46
Schofield Michael
17 19 33 34 46 47
Black Joe
1 4 9 16 25 36
Elroy Jetson
17 19 34 46 47 48
Simone Raven
5 10 17 19 34 47

我 Scan 在 File 的内容中创建了一个 Ticket 对象来保存一个人的姓名和票号但是当我尝试将该信息放入 ArrayList 时出现问题任何帮助将不胜感激。

这是我的代码:

        try
    {
        Scanner scan = new Scanner(new FileInputStream(file));
        ArrayList<Ticket> info = new ArrayList<Ticket>();
        int lim = scan.nextInt();

        for(int i = 0; i < lim; i++)
        {
            String name = scan.nextLine();
            String num = scan.nextLine();
            String[] tarr = num.split(" ");
            int[] arr = new int[tarr.length];

            for(int j = 0; j < tarr.length; j++)
            {
                arr[j] = Integer.parseInt(tarr[j]);
            }

            info.add(new Ticket(name, arr[]);
        }
        scan.close();
    }

    catch(FileNotFoundException fnfe)
    {
        System.out.println("Error! The file was not found!");
    }

}

public class Ticket
{
    public String name;
    public int[] tarray;

    public Ticket(String name, int[] tarray)
    {
        this.name = name;
        this.tarray = tarray;
    }
}

【问题讨论】:

  • 为了将来参考,最好在问题中包含堆栈跟踪。
  • 不需要FileInputStream。 new Scanner(file) 会做到的。尽管您可能希望将其移至 try 语句,即使用 try-with-resources。

标签: java arrays file arraylist


【解决方案1】:

您的原始代码实际上看起来很干净,我只发现了以下问题:

info.add(new Ticket(name, arr[]);

这不是传递变量 AFAIK 的有效 Java 语法。如果你想将 arr 的数字传递给 Ticket 类的构造函数,你应该这样做:

info.add(new Ticket(name, arr));

更新:

我已经使用 IntelliJ 在本地测试了您的代码,我发现的唯一其他潜在问题是以下行:

int lim = scan.nextInt();

调用Scanner.nextInt() 不会不将光标更新到下一行。这意味着当您尝试阅读第二行时,您仍将位于第一行。快速解决此问题的方法是更改​​为以下代码:

int lim = scan.nextInt();   // read in number of people
scan.nextLine();            // advance to second line of input file

【讨论】:

  • “使用 IntelliJ 测试 [...]”。是的,有一个新颖的概念。人们在要求其他人为他们修复代码之前测试他们的代码。
  • @Andreas 我完全同意。如果他甚至花时间剪切和粘贴堆栈跟踪,他可能会自己弄清楚。
  • @Beginner 请查看给出的答案。
【解决方案2】:

我认为问题出在 Ticket 类的构造函数中。

您不能只设置一个数组等于另一个数组。但是,您可以克隆它:

this.tarray = tarray.clone();

【讨论】:

  • 在Ticket构造函数中这样做应该没有错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
相关资源
最近更新 更多