必要だと言われたメソッドに関する限り、プログラムに必要なもののスケルトンは既にあります。ただし、それ以外は、このプログラムのコーディングを開始する方法がわかりません。詳細は以下の通りです。 私は自分のプログラムを私のためにやってくれるように頼んでいるわけではありません。テキスト ファイルを取得するためにユーザー入力を読み込む必要があることはわかっています。私の大学ではスキャナーを使用していますが、それがコンストラクター、メイン、または別のメソッドに必要かどうかはわかりません。
単一のコマンド ライン パラメータ、つまり行で区切られた文字列のペアのリストを含むテキスト ファイルを受け入れます。これらの文字列のペアは、依存グラフのエッジを表します。たとえば、A.java B.java という行は、A.java から B.java への依存エッジを表します。上記のグラフを表すファイルは次のようになります。 Main.java A.java A.java B.java
ファイルから読み取った各文字列を一意の整数識別子にマップします。このマッピングにより、ファイル名を配列インデックスに簡単に変換できます。
(上記の) 一意の整数識別子のそれぞれを元の文字列にマップします。
文字列間の依存関係を表す隣接行列を計算します。
隣接行列に対して推移閉包操作を実行して、文字列間の推移的な依存関係を表す新しい閉包行列を生成します。この操作を実行する簡単な方法は、Floyd-Warshall アルゴリズムです。このトピックについて調査することをお勧めします。
出力は、コース Web サイトのサンプル出力ファイルで示されている形式に従う必要があります。コースの Web サイトには、サンプルの入力ファイルと対応する出力ファイルがあります。この例では、出力は同じ形式である必要があります。目標は、出力情報を魅力的で読みやすい形式にして、以下にリストされている各方法が正しく機能することを明確にすることです。
プライベート フィールドを持つメソッドは、クラスの内部状態の可変部分を返すのではなく、getNameIdMap、getIdNameMap、getRoots などの型を返します。そのマップのコピー (クローン)、リストが返されます。このようにして、呼び出し元は、クラスの内部状態に影響を与えることなく、完全に使用可能なオブジェクト (リストやマップなど) を取得します。
プログラムは、次のメソッドも提供する必要があります。
public Map getNameIdMap() - 文字列から一意の整数識別子へのマッピングを返します。整数識別子は、指定された文字列の隣接行列と閉包行列へのインデックスを表します。注: 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 の Y への依存も削除されることを意味します。これにより、X が新しいリーフになる場合とならない場合があります。ファイルが論理的に削除されたことを示すために、マトリックスで特別な番号 (つまり、0 と 1 以外) を使用することを検討してください。
public List firewall(String node) - 指定されたファイルの「クラス ファイアウォール」を計算します。ソフトウェア エンジニアリングでは、クラス ファイアウォールの概念により、システムでメンテナンスが実行される場合、変更されたクラスと変更によって影響を受けるクラスのみを再テストする必要があると述べられています。注: Python では、戻り値も文字列のリストです。この方法では、間接的および直接的に影響を受けるクラスを再テストする必要があります。たとえば、クラス A がクラス B に依存し、クラス B がクラス C に依存している場合、クラス C を変更すると、クラス A と B を再テストする必要があります。
public void printParallelGroups() - ファイルのコンパイルを並列化したいとすると、他のファイルのコンパイルをトリガーしないファイルを特定する必要があります。これらは依存関係グラフの葉です。このメソッドは、並行してコンパイルできるファイルを識別し、そのファイルのリストを出力して、グラフから削除します。メソッドは、すべてのファイルが「コンパイル」されるまで、このプロセスを繰り返す必要があります。