2

興味深いジレンマがあります。

FileCabinet という名前のクラスがあるとしましょう。

FileCabinet は、「filesInCabinet」と呼ばれるファイルの LinkedList を格納します。

各ファイル内には、「relatedFiles」と呼ばれるさらに別のファイルの LinkedList があります。

たとえば、次のようになります。

ファイルキャビネット1

  • ファイル1
    • ファイル3
  • ファイル2
    • ファイル3
    • ファイル4
  • ファイル3
    • ファイル1
    • ファイル2
  • ファイル4
    • ファイル2

私が抱えている問題は、ネストされたリスト(「relatedFiles」)にファイルの個別のインスタンスが含まれているため、実際には次のようになります。

ファイルキャビネット1

  • ファイル1
    • File3_duplicate
  • ファイル2
    • File3_duplicate2
    • File4_duplicate
  • ファイル3
    • File1_duplicate
    • File2_duplicate
  • ファイル4
    • File2_duplicate2

これにより、ネストされたリストのいずれかでファイルのプロパティを変更するときに、実際のファイルのプロパティも変更したいのですが、複製のプロパティのみが変更されます。

ネストされたリスト内のファイルを、ネストされていないファイルのリストに「一致させる」ことができる効率的な方法はありますか? 各ファイルには一意の文字列、整数なども含まれているため、複製がどのファイルのクローンであるかを簡単に判断できます。

4

1 に答える 1

1

これを行うには非常に高速な方法があり、すべてのファイルをセットに入れて、関連するファイルを再度ビルドします。このような:

Map<File, File> existingFiles = new Map<File, File>();
for (File f : filesInCabinet) {
   existingFiles.put(f, f);
}

for (File f : filesInCabinet) {
   List<File> relatedFiles = f.getRelatedFiles();
   for (int i = 0; i < relatedFiles.size(); i++) {
      File relatedFile = existingFiles.get(relatedFiles.get(i));
      relatedFiles.set(i, relatedFile);
   }
}

これは、ファイルをマップに配置し、関連リストのファイルを、equals / hashcodeの実装により、Mapから取得したファイルに置き換えるだけで機能します。したがって、関連オブジェクトを提供すると、メインリスト(filesInCabinet)からインスタンスを取得します。

これは、hashCodeとequalsをファイルに実装する必要があることを意味します。

于 2012-06-08T21:13:55.313 に答える