我有一个有趣的困境:
我有一个类,假设它叫做FileCabinet。
FileCabinet 存储一个 LinkedList of Files,称为"filesInCabinet"。
在每个文件中,还有另一个文件链接列表,称为"相关文件"。
所以它看起来像这样,例如:
文件柜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
有了这个,当我去更改其中一个嵌套列表中的文件的属性时,我希望它也更改真实文件的属性,但它只更改副本的属性。
有没有一种有效的方法可以将嵌套列表中的文件与非嵌套文件列表中的文件"匹配"?每个文件还包含唯一的字符串,整数等,因此很容易确定副本是哪个文件的克隆。
非常快速的方法可以做到这一点,将所有文件放在一个集合中并再次构建相关文件。喜欢这个:
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) 获取实例。
这意味着哈希代码和等于需要在文件上实现。