Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:在嵌套列表中匹配列表_Java_List_Linked List - Fatal编程技术网

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

Java:在嵌套列表中匹配列表,java,list,linked-list,Java,List,Linked List,我有一个有趣的两难选择: 我有一门课,比方说叫FileCabinet FileCabinet存储文件的链接列表,称为“filesInCabinet” 在每个文件中,还有另一个文件链接列表,称为“relatedFiles” 所以它看起来有点像这样,例如: 文件柜1 文件1 文件3 文件2 文件3 文件4 文件3 文件1 文件2 文件4 文件2 我遇到的问题是,嵌套列表(“relatedFiles”)包含文件的独立实例,因此实际上更像: 文件柜1 文件1 文件3\u重复 文

我有一个有趣的两难选择:

我有一门课,比方说叫FileCabinet

FileCabinet存储文件的链接列表,称为“filesInCabinet”

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

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

文件柜1

  • 文件1
    • 文件3
  • 文件2
    • 文件3
    • 文件4
  • 文件3
    • 文件1
    • 文件2
  • 文件4
    • 文件2
我遇到的问题是,嵌套列表(“relatedFiles”)包含文件的独立实例,因此实际上更像:

文件柜1

  • 文件1
    • 文件3\u重复
  • 文件2
    • 文件3\u重复2
    • 文件4_重复
  • 文件3
    • 文件1\u重复
    • 文件2\u重复
  • 文件4
    • 文件2_重复2
这样,当我在一个嵌套列表中更改文件的属性时,我希望它也更改真实文件的属性,但它只更改副本的属性


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

有一种非常快速的方法,将所有文件放在一个集中,然后重新构建相关文件。像这样:

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);
   }
}
Map existingFiles=new Map();
for(文件f:filesInCabinet){
现有文件.put(f,f);
}
for(文件f:filesInCabinet){
List relatedFiles=f.getRelatedFiles();
对于(int i=0;i
它的工作原理是将文件放入映射中,并将相关列表中的文件替换为由于equals/hashcode实现而从映射中获得的文件,因此,当您提供相关对象时,可以从主列表(filesInCabinet)中获得实例


这意味着需要在文件上实现hashCode和equals。

为什么不首先用引用而不是重复的引用来构建列表?这还不清楚,您说“我想更改真实文件的属性”。你说的“真实文件”是什么意思?这些文件是java.io.File吗?在“真实文件”中未反映的文件实例中,您正在更改哪些属性?我认为这里需要更多的信息,它们不是java.io.File的。我给他们打电话只是因为我需要给他们打电话,我甚至说这只是一个例子。它们只是简单的Java类。使用一些代码会更容易。为什么不跟踪另一个集合中的重复文件,比如
映射
,这样当您修改某些内容时,您可以将其全部更新,并且所有更改都会反映出来。谢谢!虽然这是一种在列表中迭代的奇怪方式。就我个人而言,我会为(文件f:relatedFiles)这样做,只是为了访问索引;)