我有一个有趣的困境:
我有一个课程,我们说它叫做FileCabinet。
FileCabinet存储一个LinkedList of Files,名为“filesInCabinet”。
在每个文件中,还有另一个LinkedList of Files,称为“relatedFiles”。
所以看起来有点像这样:
FileCabinet1
我遇到的问题是,嵌套列表(“relatedFiles”)包含文件的单独实例,所以实际上它更像是:
FileCabinet1
有了这个,当我在其中一个嵌套列表中更改文件的属性时,我希望它也可以更改实际文件的属性,但它只会更改副本的属性。
有没有一种有效的方法可以将嵌套列表中的文件“匹配”到非嵌套的文件列表?每个文件还包含唯一的字符串,整数等,因此很容易确定副本是哪个文件的克隆。
答案 0 :(得分: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);
}
}
它只是将文件放入映射并将相关列表中的文件替换为由于等于/ hashcode实现而从Map获取的文件,因此当您提供相关对象时,您将从主列表中获取实例( filesInCabinet)。
这意味着需要在File上实现hashCode和equals。