2012-06-08 63 views
2

我有一個有趣的困境:Java:在嵌套列表中匹配列表

我有一個類,讓我們說它叫做FileCabinet。

FileCabinet存儲文件的LinkedList,稱爲「filesInCabinet」。

在每個文件中,還有另一個文件LinkedList,稱爲「relatedFiles」。

所以它看起來是這樣的,例如:

FileCabinet1

  • 文件1
    • 文件3
  • 文件2
    • 文件3
    • FILE4
  • 文件3
    • 文件1
    • 文件2
  • FILE4
    • 文件2

我就吃我的問題克,是嵌套列表( 「relatedFiles」)包含單獨的實例文件的,所以實際上它更像是:

FileCabinet1

  • 文件1
    • File3_duplicate
  • File2
    • File3_duplicate2
    • File4_duplicate
  • 文件3
    • File1_duplicate
    • File2_duplicate
  • FILE4
    • File2_duplicate2

這樣,當我去更改嵌套列表中的某個文件的屬性時,我希望它也更改真實文件的屬性,但它只會更改副本的屬性。

有沒有一種有效的方法可以將嵌套列表中的文件'匹配'到非嵌套的文件列表?每個文件還包含獨特的字符串,整數等,因此很容易確定哪個文件是重複的克隆。

+3

爲什麼不建立列表的引用而不是重複在第一位? – DGH

+0

這個不清楚,你說「我想改變真實文件的屬性」。 「真實文件」是什麼意思?這些文件是否是java.io.File?您在文件實例中更改哪些屬性未反映在「實際文件」中?我想這裏需要更多的信息。 –

+0

它們不是java.io.File的。我給他們打電話是因爲我需要給他們打電話,我甚至說這只是一個例子。它們只是簡單的Java類。 – Blackvein

回答

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); 
    } 
} 

它只是把文件放到一個地圖,並與一個從地圖得到應有的平等/哈希碼實現,所以當你提供相關的對象你更換相關列表中的文件主列表中的實例(filesInCabinet)。

這意味着hashCode和equals需要在File上實現。

+0

謝謝!雖然這是一個奇怪的方式來遍歷列表。我個人會這樣做(文件f:relatedFiles) – Blackvein

+1

這種方式只是用來訪問索引;) –