2015-05-07 109 views
1

嘿,我有兩個類型的對象列表。我想遍歷這兩個列表並查找具有相同屬性的對象,即文件夾路徑,以便我可以組合他們都擁有的另一個屬性。現在我使用2 for for循環和檢查內部循環中的匹配,這個工程。但我的問題是有沒有更有效的方法?由於通過兩個對象列表循環來找到相同的對象java

    for(int z = 0; z < pList.size(); z++) 
        { 
         for(int c = 0; c < eList.size(); c++) 
         { 
          if(pList.get(z).path.equals(eList.get(c).path)) 
          { 
           Pair rank = new Pair(); 
           rank.k = z + c/2.0; 
           rank.path = pList.get(z).path; 
           pcList.add(rank); 
          } 
         } 

        } 
+0

你可以發佈你的兩個列表嗎? – MChaker

+0

如果您的列表已排序,則可避免從頭開始內部循環。而是從最後找到的索引開始。 –

+0

這些列表只是一個自定義對象,它包含一個雙精度和一個字符串 –

回答

1

您應該使用Map<String,P>,並記錄所有P,它出現在一個通行證。

for (int z = 0; z < pList.size(); z++) { 
     map.put(pList.get(z).path, pList.get(z)); 
    } 

然後運行您的eList,在地圖中查找路徑以獲取與其關聯的pList條目。

for (int c = 0; c < eList.size(); c++) { 
     P p = map.get(eList.get(c).path); 
     if (p != null) { 
      Pair rank = new Pair(); 
      rank.k = z + c/2.0; 
      rank.path = p.path; 
      pcList.add(rank); 
     } 
    } 
2

我不認爲還有另一種方式,如果你要檢查每一個元素

BTW,你應該改變你的命名約定,以便我們瞭解您的名單包含的內容。

清潔碼書是你的朋友;)

2

最好的辦法是遍歷第一個列表,並把一組內的所有路徑。然後,當遍歷第二個列表時,只需檢查您的集合中是否有此路徑。

您應該大幅減少操作次數。你的代碼應該是這個樣子:

Set<Path> paths = pList.stream().map(o - > o.path).collect(Collectors.asSet()); 

for(T obj : eList){ 
    if(paths.contains(obj.path)){ 
    ... // rest of your code 
    } 
} 
+0

找到相同的列表。這聽起來像個好主意,現在我試試這個。謝謝 –