2016-02-28 94 views
0

我有兩種類型的循環,fileList在這種情況下,僅僅是通過索引擴展AbstractList<Object>不同類型的for循環

1) For循環迭代的自定義類:

public String getExtensionByDescription(String description) 
{ 
    for (int i = 0; i < fileList.size(); i++) 
     if (description.contains(fileList.get(i).getDescription())) 
      return fileList.get(i).getExtension(); 
} 

2) For循環按列表中的項目迭代:

public String getExtensionByDescription(String description) 
{ 
    for (FileType obj : fileList) 
     if (description.contains(obj.getDescription())) 
      return obj.getExtension(); 
} 

方法1)和2)邏輯上相同還是不是?因爲1)返回我期望的值,但方法2)返回錯誤的值。謝謝您的幫助!

與各種其他get方法的列表的實現。

public class FileList extends AbstractList<Object> 
{ 
    private ArrayList<FileType> fileList; 

    public FileList() 
    { 
     fileList = new ArrayList<FileType>(); 
    } 

    public void add(String search, String type, String extension, String description, String htmlicon) 
    { 

     FileType data = new FileType(fileList.size(), search, type, extension, description, htmlicon); 
     if (!fileList.contains(data)) 
     { 
     fileList.add(data); 
     } 
    } 

    @Override 
    public Object get(int index) 
    { 
     return fileList.toArray()[index]; 
    } 

和其他類

public FileType(int index, String search, String type, String extension, String description, String icon) 

與功能:

public String getDescription() 
{ 
    return description; 
} 
+0

'AbstractList '? 'description.contains'的簽名是什麼? – Makoto

+1

爲什麼擴展一個列表類,你可以從頭開始創建一個'ArrayList '? –

+0

我老實說,現在不記得了,有一個原因,我記得它是一個很好的理由,但我現在正在進行30小時的編碼,我不記得了。我只知道我必須擴展它並創建我需要的自定義get方法,否則我找不到FileType值。 – codeCompiler77

回答

5

如果這是正確執行的List,那麼他們將在邏輯上是相同的(雖然可以在不同性能條款)。

如果它們給出不同的結果,則get(int)方法或iterator()方法的行爲不如預期,即不返回i-第元素或不分別遍歷所有元素。

編輯:問題更新後,問題是明確的 - 你重寫get(int)方法(雖然它返回對象,但在代碼中它作爲FileType訪問 - 看起來可疑)。但是沒有覆蓋iterator()方法。由iterator()返回的Iterator實際上在編譯器透明地在第二個for循環中使用。除非你重寫代碼無法工作。

+1

我認爲這比這更微妙一點。事實上,這是一個使用Object作爲其支持類型的列表,這讓我相信還有其他事情正在發生。 – Makoto

+1

+1。同樣重要的是要注意第二個將支持任何'Collection',允許'FileList'被更改爲'Set'或者數組而不會對這個代碼做任何改變。 – Obicere

+0

對不起,我需要做些什麼來解決這個問題?實施'Collections'?並創建一個重載的'迭代器'?我的迭代器應該是什麼? @Makoto我也刪除了'',現在它只是一個AbstractList而且工作正常:S – codeCompiler77

0

您可能在這裏混合了一些東西。

  • 你的包容類有一個迭代器,當你想要做的一切都遍歷你的後盾ArrayList
  • 你改寫了get,它保證在使用時能讓你回到你想要的結果,但沒有考慮到iterator()

最終,根本沒有理由延長AbstractList。只需使用支持列表。

要做到這一點,創建一個getter它:

public ArrayList<FileType> getFileList() { 
    return fileList; 
} 

...,然後在迭代使用它:

for(FileType type : fileList.getFileList()) { 
    // logic here 
} 

然後,它將行爲無異於你的get