Java:匹配嵌套列表中的列表

时间:2012-06-08 20:57:52

标签: java list linked-list

我有一个有趣的困境:

我有一个课程,我们说它叫做FileCabinet。

FileCabinet存储一个LinkedList of Files,名为“filesInCabinet”。

在每个文件中,还有另一个LinkedList of Files,称为“relatedFiles”。

所以看起来有点像这样:

FileCabinet1

  • File1中
    • 文件3
  • 文件2
    • 文件3
    • FILE4
  • 文件3
    • File1中
    • 文件2
  • FILE4
    • 文件2

我遇到的问题是,嵌套列表(“relatedFiles”)包含文件的单独实例,所以实际上它更像是:

FileCabinet1

  • File1中
    • File3_duplicate
  • 文件2
    • File3_duplicate2
    • File4_duplicate
  • 文件3
    • File1_duplicate
    • File2_duplicate
  • FILE4
    • File2_duplicate2

有了这个,当我在其中一个嵌套列表中更改文件的属性时,我希望它也可以更改实际文件的属性,但它只会更改副本的属性。

有没有一种有效的方法可以将嵌套列表中的文件“匹配”到非嵌套的文件列表?每个文件还包含唯一的字符串,整数等,因此很容易确定副本是哪个文件的克隆。

1 个答案:

答案 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。