无法将新对象添加到集合中,值来自文件

时间:2016-04-19 12:02:02

标签: java set java.util.scanner bufferedreader

我正在尝试创建一个不带参数的公共实例方法,并且不返回任何值。需要从用户那里获得输入以选择文件,这部分我没有问题。该方法需要使用BufferReaderScanner对象。这样它就可以读取所选的文件。对于每个读取的行,应创建一个新对象,并使用文件中的值设置其实例变量 然后应将创建的对象添加到列表中。这是我遇到问题的地方,它不会让我将新对象添加到列表中。以下是我的代码:

public void readInEntrants()
{
    String pathname = OUFileChooser.getFilename();
    File aFile = new File(pathname);  
    Scanner bufferedScanner = null;
    Set<Entrant> entrantSet = new HashSet<>();

    try
    {
        String currentEntrantLine;
        Scanner lineScanner;
        bufferedScanner = new Scanner(new BufferedReader(new FileReader(aFile)));

        while (bufferedScanner.hasNextLine())
        {
            currentEntrantLine = bufferedScanner.nextLine();
            lineScanner = new Scanner(currentEntrantLine);
            lineScanner.useDelimiter(" ");
            currentEntrantLine = lineScanner.next();
            entrantSet.add(new Entrant(currentEntrantLine)); // <----- Here is where I am having trouble. It won't let me add the new object to the class Entrant
        }
    }
    catch (Exception anException)
    {
        System.out.println("Error: " + anException);
    }
    finally
    { 
        try
        {
            bufferedScanner.close();
        }
        catch (Exception anException)
        {
            System.out.println("Error: " + anException);
        }
    }

    return entrantSet;
}

我不知道该怎么做。谁能看到我做错了什么?

很抱歉要添加它是一个编译问题,它将无法正确编译。

3 个答案:

答案 0 :(得分:0)

使用IDE,我打赌你不要(否则它会立即用红色标记编译错误 - &gt; 你在void方法中使用return ),在这种情况下你会看到其他错误。

(关闭:这将是评论部分,但是根据50声明,我不被允许这样做.Stackoverflow应该改变这个imo。)

答案 1 :(得分:0)

您可以共享Entrant类吗?似乎进入者类的构造函数没有任何参数。在构造函数中将String作为参数类型传递,以在Entrant类中设置String字段。

答案 2 :(得分:0)

首先:

您将函数readInEntrants标记为public void,因此您无法在内部使用return。 您可以删除return entrantSet;指令或将函数定义更改为public Set<Entrant> readInEntrants

关于你遇到的问题:

根据你对beatrice回答的评论,我认为你只有'Entrant'类的无参数构造函数,而你尝试创建它作为参数传递字符串。 new Entrant(currentEntrantLine)

您需要做的是定义接受String作为其参数的Entrant类构造函数。例如:

public Entrant(String dataToParse)
{
// here you parse data from string to entrant fields
}

侧面: 您可以使用bufferedReader一次读取整个文件行,这没关系,但是您可以定义Scanner lineScanner来迭代行元素,然后只使用一次。 文件的这种方式......让我们说:

  

一二三

     

四五六

你的while循环可以这样工作:

  1. currentEntrantLine内存储“一二三”。
  2. 创建“一二三”的扫描仪,并将其设置为使用空格作为分隔符。
  3. 使用.next“查找并返回下一个完整令牌”(请参阅​​documentation),然后将值存储在currentEntrantLine中。这样currentEntrantLine的内容就是“一个”。不是整行。
  4. 在下一次迭代中,您将使用扫描仪处理“四五六”和“四”作为currentEntranceLine内容。