2015-12-29 174 views
0

我試圖比較兩個相同對象的列表,這兩個列表是nodes_ccnodes_volume。它們包含多個Node對象。由IDVALUE定義的Node is。兩個列表上的節點可以具有公共ID,但不具有公共值。我想控制第一個列表(nodes_cc),如果我遇到一個沒有出現在第二個列表(nodes_volume)上的節點,那麼控制必須停止,即使我會找到甚至屬於第二個列表的其他節點。我想用一個突破,所以我嘗試這樣做:Java:比較兩個對象列表

int count=0; 

for (int i=0;i<cc_nodes.size();i++){ 
    Node node = cc_nodes.get(i); 
    for(int j=0;j<volume_nodes.size();j++){  
     Node node2 = volume_nodes.get(j); 
     if (node.id==node2.id){ 
      count++;      
     } 
     else { 
      break;   
     }  
    } 
} 

的問題是:只有在第一次檢查後的循環中斷(計數1),在那裏我做錯了什麼?你能幫我解決這個問題嗎?

回答

1

你可以使用一些布爾,和你的內心for循環後檢查:

int count=0; 

    for (int i=0;i<cc_nodes.size();i++){ 

     Node node = cc_nodes.get(i); 
     boolean found = false; 

     for(int j=0;j<volume_nodes.size();j++){  
      Node node2 = volume_nodes.get(j); 
      if (node.id==node2.id){ 
       count++; 
       found = true;   
      } 

     } 

     if(!found) 
      break;  

    } 
+0

Thc時,但它doesen't WOR ks,1步後仍然停止ç_ç – Removed

+0

節點的「id」的類型是什麼? – Berger

+0

似乎它沒有像if與equals一樣,我遇到了錯誤「int不能被解除引用」 – Removed

0

你可以覆蓋.equals()和.hashcode()方法的Node對象使用id作爲比較,然後:

int count=0; 

for (Node node : cc_nodes){ 
    if(volume_nodes.contains(node)) 
     count++; 
    else 
     break; 
} 

可以在Node對象添加這個(如果id爲int值)

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + id; 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Node other = (Node) obj; 
    if (id != other.id) 
     return false; 
    return true; 
} 
+0

我不能使用包含,因爲這兩個列表可以具有具有公共ID但不具有共同VALUES的節點。第一個列表的節點具有所有的int值,而第二個列表的所有值都是double。所以,包含將永遠返回false。 – Removed

+0

除非您覆蓋節點對象中的等值 –