2015-12-29 132 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

除非您覆盖节点对象中的等值 –