2

我有一个有趣的困境:

我有一个类,假设它叫做 FileCabinet。

FileCabinet 存储文件的 LinkedList,称为“filesInCabinet”。

在每个文件中,还有另一个文件链接列表,称为“relatedFiles”。

所以它看起来像这样,例如:

文件柜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 需要在 File 上实现。

于 2012-06-08T21:13:55.313 回答