就我告诉我需要的方法而言,我已经拥有了我需要的程序骨架。但是,除此之外,我无法弄清楚如何开始编写这个程序。详情如下所示。 我没有要求为我完成我的程序,字面上我只是对如何开始感到困惑。我知道我需要读取用户输入来获取文本文件,我们在学院使用扫描仪,但我不知道是否需要在构造函数中,主要或不同的方法。
接受单个命令行参数 - 即包含以行分隔的字符串对列表的文本文件。这些String对将表示依赖图中的边。例如,一行代码为:A.java B.java表示从A.java到B.java的依赖边缘。表示上图的文件可能如下所示:Main.java A.java A.java B.java
将从文件中读取的每个字符串映射到唯一的整数标识符。这种映射可以很容易地将文件名转换为数组索引。
将每个唯一的整数标识符(从上面)映射回原始字符串。
计算表示字符串之间依赖关系的邻接矩阵。
对邻接矩阵执行传递闭包操作,以生成一个新的闭包矩阵,表示字符串之间的传递依赖关系。执行此操作的一种简单方法是Floyd-Warshall算法 - 您可能希望对此主题进行一些研究。
您的输出必须遵循课程网站上示例输出文件所示的格式。在课程网站上是一个示例输入文件和相应的输出文件。在此示例中,您的输出必须具有相同的格式。目标是使输出信息具有吸引力,可读的格式,清楚地表明下面列出的每种方法都能正常工作。
具有私有字段返回类型的方法,如getNameIdMap,getIdNameMap,getRoots等 而不是返回我们类的内部状态的可变部分,应该返回该映射列表的副本(克隆)。这样调用者就可以获得一个完全可用的对象(例如,列表或映射),而不会影响类的内部状态。
您的计划还应提供以下方法:
public Map getNameIdMap() - 返回从String到唯一整数的映射 标识符。整数标识符表示给定String的邻接和闭包矩阵的索引。注意:在Python中,返回值必须是具有键的字典,其中键是字符串,值是int。
public Map getIdNameMap() - 返回唯一整数标识符的映射 到原始字符串。注意:在Python中,返回值必须是具有键的字典,其中键是int,值是字符串。
public int [] [] getDependenceGraph() - 返回表示文件之间依赖关系的邻接矩阵。
public int [] [] getTransitiveDependenceGraph() - 在应用传递闭包操作后返回依赖图。
public List getRoots() - 返回与其他文件所依赖的文件相对应的字符串列表(例如,上例中的Main)。注意:在Python中,返回值也是字符串列表。
public List getLeaves() - 返回与不依赖于其他文件的文件相对应的字符串列表(例如,上例中的B)。注意:在Python中,返回值也是字符串列表。
public void removeLeaf(String leaf) - 从邻接和传递闭包矩阵中删除一个叶子。这意味着如果X取决于Y而Y是被移除的叶子,则X的依赖性也被消除。这可能会也可能不会使X成为一片新叶。考虑在矩阵中使用一个特殊数字(即0和1以外的数字)来表示该文件已被逻辑删除。
public List firewall(String node) - 计算"类防火墙"指定文件的。在软件工程中,类防火墙概念指出,当在系统上执行维护时,只需要重新测试受更改影响的已更改的类和类。注意:在Python中,返回值也是字符串列表。对于此方法,您应该重新测试间接影响的类以及直接影响的类。例如,如果A类依赖于B类而B类依赖于C类而您更改C类,则应重新测试A类和B类。
public void printParallelGroups() - 假设我们想要并行化文件的编译,我们需要识别不会触发其他文件编译的文件;这些是依赖图中的叶子。此方法标识可以并行编译的文件,打印该文件列表,并从图表中删除它们。该方法应重复此过程,直到所有文件都已编译为#34;。
答案 0 :(得分:0)
在开始编写一些代码时,我遇到过类似的情况。我想,你对你的问题非常了解。您可以制作一个包含2-3个值的示例文本文件(即使在一张纸上),并尝试更多地考虑您想要的内容。您知道需要一个带有文件名的main方法。您可以在main或构造函数中使用扫描程序,也可以使用任何其他方法。这取决于您使用的设计。如果你想要一个非常基本的程序,你可以在main方法中声明它并继续。但我建议您应该使用另一种方法从文件中获取输入,例如readInputFromText(),您可以在其中声明本地扫描程序对象。你也可以通过其他方式做到这一点。 我遵循的一些基本规则是:
为每项任务分别设置方法。要打开文件,我有一个fileOpener,关闭它,我有另一个方法等。每个方法只能执行一个任务。与文件相关的所有函数都将放在一个类中,例如FileUtil。这是一个实用程序任务,而不是您的主要任务,因此您将所有这些util类保留在Util包中,如FileUtilities,StringUtilities,DatabaseUtilites等。
良好的命名策略和以下惯例。
使用Maven或Ant等构建工具。
做文档和正确的测试。
我不知道它是否真的以某种方式回答了你的问题。但请记住这些并开始您的计划。在每个阶段进行测试并制作主要版本。保留后续版本的改进。
如果您有具体问题,一个大社区正等着您:)
祝福。