完全被Java问题困扰

时间:2011-09-17 05:32:01

标签: java arrays algorithm java.util.scanner

请注意:我不是“寻找代码” - 只是解决这个问题的算法的想法。

这是一项家庭作业。我以为我在家里,即将完成它,但最后一部分绝对难倒我。从来没有像这样被困住。它与Java中的线程有关。

Driver类读取文件,第一行表示线程数,第二行是每个要读取的线程的空格分隔文件名列表。每个线程编号(0 - N),N是文件总数。每个线程读取指定的文件,并输出到名为t#_out.txt的文件,其中#是线程索引。

完成所有这些后,驱动程序线程必须:

  

在所有线程完成执行后,程序Driver.java将打开所有线程   输出文件t#_out.txt,从每个文件中读取一行,然后写入   输出到输出文件out.txt。

out.txt示例:

MyThread [0]:Line [1]:有一些不爱墙的东西,
MyThread [1]:Line [1]:世界的HOG Butcher,
MyThread [2]:Line [1]:我想我永远不会见到 MyThread [0]:Line [2]:在它下面发送冻土膨胀,
MyThread [1]:Line [2]:Tool Maker,Wheat Stacker,
MyThread [2]:Line [2]:一首可爱的诗 MyThread [0]:Line [3]:在阳光下溢出上部巨石,
MyThread [1]:Line [3]:铁路玩家和国家货运处理员;
MyThread [2]:Line [3]:饥肠辘辘的树

我的问题是:我可以设置什么样的循环结构来执行此操作?从t1_out.txt读取一行,写入out.txt,从t2_out.txt读取行,写入out.txt,从tN_out.txt读取行,写入out.txt?我如何知道一个文件何时到达?

思路:

  1. 使用while(!done)循环继续循环,直到每个扫描程序完成。跟踪一系列布尔值,指示扫描仪是否已完成读取其文件。扫描仪也会在阵列中。这个问题是如何判断ALL何时完成,完成无限循环?在每次迭代中,看看booleans [i]是否完成,如果没有,则完成= false?不好。

  2. 只需将每个文件行读入自己的String []数组。然后找出一个循环来交替写入out.txt。问题是当我点击数组索引超出范围时会发生什么?这也不是规格,它说要读一行,然后写一行。

  3. 编辑:解决方案是创建一个allFilesReachedEOF()方法,其初始布尔值为true。然后循环遍历每个,如果ANY有另一行要读取,则将返回条件设置为false。这是我的while循环条件:while(!allFilesReachedEOF())。

    我的问题是我试图从循环中控制循环。因此,如果一个文件有另一行,它将继续,但如果任何文件EOF,循环将停止。

    感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

你可以做一段时间,条件是并非所有文件都达到了EOF。然后迭代遍历所有文件,对于那些尚未达到EOF的文件,读取下一行并将其写入输出文件。当你去的时候,你为“while”循环更新你的条件变量。

这是你想要做的吗?

答案 1 :(得分:1)

听起来你可以使用Queue来实现这一目标。将每个t#_out.txt的输入添加到Queue,然后实现一个循环,在该循环中,您从轮询输入中读取一行并将其写入输出。只要读取的行不是EOF,请将输入重新添加到Queue。当Queue为空时,从循环中断开。

另外,我建议输出BufferedWriter,最后flush(),以便实际写入只发生一次。

答案 2 :(得分:0)

以下是要点:

  • 创建一个实现Runnable的类,其run()方法执行您需要一个线程执行的操作。它可能需要threadNumberfilename的字段。 run方法应确保close()输出文件的输出流
  • 对于您需要创建的每个线程,实例化您的一个类(为其提供所需的文件名(和其他)数据)并将其传递给constructor of Thread。保持对Thread对象的引用
  • 在所有线程上调用start()方法
  • 在所有线程上调用join()方法(join等待线程完成)
  • 执行打开输出文件的最终驱动程序任务

答案 3 :(得分:0)

这可以通过使用do - while“退出条件”循环和内部for循环来迭代输出文件来完成。在for循环开始之前将退出条件设置为true,如果从任何文件获得至少一行,则在for循环内重置它。

已经达到eof的文件将继续被读取,但不会返回任何行。您可以选择为这些行打印空行或只是跳过它们。