Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
完全被Java问题难住了_Java_Arrays_Algorithm_Java.util.scanner - Fatal编程技术网

完全被Java问题难住了

完全被Java问题难住了,java,arrays,algorithm,java.util.scanner,Java,Arrays,Algorithm,Java.util.scanner,请注意:我不是在“寻找代码”-只是解决这个问题的算法的想法 这是一个家庭作业。我原以为我已经到了本垒打阶段,就要完成比赛了,但最后一部分完全难住了我。我从来没有像这样被困过。它与Java中的线程有关 驱动程序类读取一个文件,第一行表示线程数,第二行是每个线程要读取的文件名的空格分隔列表。每个线程都被编号(0-N),N是文件的总数。每个线程读取指定的文件,并输出到名为t##u out.txt的文件,其中#是线程索引 完成所有这些操作后,驱动程序线程必须: 在所有线程完成执行后,程序Driver.j

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

这是一个家庭作业。我原以为我已经到了本垒打阶段,就要完成比赛了,但最后一部分完全难住了我。我从来没有像这样被困过。它与Java中的线程有关

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

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

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

out.txt的示例:

MyThread[0]:行[1]:有些东西不喜欢墙,
MyThread[1]:行[1]:世界猪屠夫,
MyThread[2]:行[1]:我想我永远也见不到
MyThread[0]:第[2]行:发送其下方的冻土膨胀,
MyThread[1]:行[2]:工具制造商,小麦堆垛机,
神话阅读[2]:诗句[2]:一首像树一样可爱的诗。
神话阅读[0]:第[3]行:在阳光下洒向上面的巨石,
MyThread[1]:Line[3]:铁路和国家货运处理公司的玩家
神话读物[2]:第[3]行:一棵饥饿的树

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

想法:

  • 使用while(!done)循环继续循环,直到完成每个扫描仪。跟踪一组布尔值,这些布尔值指示扫描仪是否已完成文件读取。扫描器也将在一个阵列中。问题是,我如何判断何时完成所有操作,以完成我的无限循环?在每次迭代中,查看布尔[i]是否完成,如果未完成,则done=false?不好

  • 只需将每个文件行读入自己的字符串[]数组。然后找出一个循环,以交替写入out.txt。问题是当我将数组索引打到超出范围时会发生什么?这也不在规范中,它说读一行,写一行

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

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


    谢谢你的帮助

    如果不是所有的文件都已达到EOF,则可以执行一段时间。然后遍历所有文件,对于那些尚未达到EOF的文件,读取下一行并将其写入输出文件。在运行过程中,更新“while”循环的条件变量


    这就是你想要做的吗?

    听起来你可以用a来实现这一点。将每个t#u out.txt的输入添加到
    队列
    中,然后实现一个循环,从轮询的输入中读取一行并将其写入输出。只要读取行不是EOF,就将输入重新添加到
    队列
    。当
    队列
    为空时,从循环中中断


    此外,我还建议为输出使用一个函数,在结尾处使用flush(),这样实际写入只发生一次。

    以下是要点:

    • 创建一个类,该类实现其
      run()
      方法完成您需要一个线程完成的任务。它可能需要
      threadNumber
      filename
      的字段。run方法应确保关闭()输出文件的输出流
    • 对于需要创建的每个线程,实例化一个类(为其提供所需的文件名(和其他)数据),并将其传递到。保留对线程对象的引用
    • 在所有线程上调用该方法
    • 在所有线程上调用该方法(join等待线程完成)
    • 执行打开输出文件的最后驱动程序任务

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


    已达到eof的文件将继续读取,但不会返回任何行。您可以选择打印这些内容的空行,也可以跳过这些内容。

    您知道吗?这与我尝试执行的操作类似,但我的问题是,我将eofReached标志设置为false。如果我将此检查放入一个方法中,并最初将其设置为TRUE,然后循环每个扫描器以查看它是否为.hasNext(),这可能会起作用。我会很快给你更新的。酷,让我知道它是怎么回事。就是这样-这是我的初始标志,我试图从循环中设置。谢谢我已经完成了前4点,我的问题是最后一点。在所有join()方法返回(这是一个阻塞调用)后,所有线程都已完成,输出文件已准备就绪read@Bohemian-我不认为多线程是这里的问题。OP询问的是(同步)任务,即一次读一行每个't#u out.txt'(循环),然后将所有内容写入
    out.txt
    。感谢您的建议,虽然我可能已经走了这条路线,但现在是凌晨1:17,我很累:)。