2012-04-03 64 views
0

我需要小小的幫助。我有2個列表(比如A和B),它們具有用戶定義類的對象。在java中進行列表操作所需的邏輯幫助

A和B都有一個方法getId(),它將返回一個整數(ID)。現在,我需要將列表A中每個對象的ID與列表B中的每個對象進行比較。如果ID相同,則必須將該對象從B替換爲A.

如果從A對象不是在B,則我想補充一點,對象爲B

請提供關於如何實現這一目標

感謝

+0

我試過這個http://stackoverflow.com/questions/9977658/concurrentmodificationexception-help-in-iterator#comment12748686_9977658 – jeyaprakash 2012-04-03 06:03:20

+0

但問題是它檢查A中的每個對象與B中的所有對象,如果它不相同,它將一次又一次地添加對象 – jeyaprakash 2012-04-03 06:05:35

+0

我只想看看B是否包含A中的當前對象,如果是,那麼用這個替換這個對象只需添加它 – jeyaprakash 2012-04-03 06:06:32

回答

3

像這樣的工作,假設你的清單是用一個索引來訪問元素的可能性的ArrayList中

for(int i=0;i<a.size();i++) 
    for(int j=0;j<b.size();j++) 
     if(a.get(i).getId().equals(b.get(j).getId()){ 
     //this id from A exists in B. Replace 
     b.get(j)=a.get(i); 
     } 
     else{ 
      if(j=(b.size()+1)){ // if true the whole b list have been searched 
      //object not found. Add it to b 
      b.add(a.get(i));  
      } 
} 

這requiers是在您的元素和b重載equals statment,這樣他們就可以比較與彼此的ID

+0

謝謝,但問題是假設列表A有{1,2,3}(考慮1,2,3是對象的id),而B有{5,6,7},現在將比較1 5並且它不會匹配並且將被添加到B,並且再次將1與6進行比較並且再次將它添加,並且它繼續,如果B包含A的對象然後它必須被替換,我需要它與A,或者只是加上 – jeyaprakash 2012-04-03 06:38:04

+0

哦,你說得對。一種解決辦法是打破;在else語句中。這將打破內循環,這意味着第一個循環並將i設置爲1。所以,如果你有你所說的a = {1,2,3}和b = {5,6,7},那麼1就與5進行比較,不匹配,所以它給b加1,突破循環,現在2將與5比較,這是你想要的 – 2012-04-03 06:47:56

+0

我真的appriciate你的幫助吉米,這是一個很好的邏輯,但有一個小的循環漏洞,如果假設b = {5,6,7,1},1將被檢查與5,它會爆發。但是在第四位有一場比賽。 :( – jeyaprakash 2012-04-03 06:56:55

2

你爲什麼不到位名單的使用Hashtable的邏輯。您可以將ID作爲每個對象的關鍵字。

+1

假設ID對於涉及的對象是唯一的,這是一個很好的建議。 – user949300 2012-04-03 06:16:21

1

您應該使用的界面處的getId()方法:

private List<Identity> listA = new ArrayList(); 
private List<Identity> listB = new ArrayList(); 

private void syncLists() { 
    final Map<Long, Identity> map = new HashMap(); 

    // add all elements of list b 
    for (Identity element : this.listB) { 
     map.put(element.getID(), element); 
    } 

    // add all elements of list a, overwrite the existing ones of b 
    for (Identity element : this.listA) { 
     map.put(element.getID(), element); 
    } 

    // write the elements of the map back into the lists 
    this.listA = new ArrayList(map.values()); 
    this.listB = new ArrayList(map.values()); 
    // list a contains the same references as list b now 
} 

我假定的equals()不被覆蓋:

public interface Identity {  
    public long getID(); 
} 

現在我們做的伎倆,以兩個列表同步爲你的對象!

1

我創建的示例程序。希望這可能有所幫助。

public static void main(String[] args) { 
    List<User> A = new ArrayList<User>(); 
    List<User> B = new ArrayList<User>(); 
    A.add(new User(1, "A1")); 
    A.add(new User(2, "A2")); 
    A.add(new User(3, "A3")); 

    B.add(new User(1, "B1")); 
    B.add(new User(4, "B4")); 
    B.add(new User(5, "B5")); 

    for (int i = 0; i < A.size(); i++) { 
     for (int j = 0; j < B.size(); j++) { 
      if (A.get(i).getId() == B.get(j).getId()) { 
       B.remove(j); 
       B.add(j, A.get(i)); 
      } else { 
       if (!B.contains(A.get(i))) { 
        B.add(A.get(i)); 
       } 
      } 
     } 
    } 
    System.out.println("-----Finally------"); 
    for (User u : A) 
     System.out.println("From A-->" + u.getName()); 
    for (User u : B) 
     System.out.println("From B-->" + u.getName()); 

} 

和類用戶是:

class User { 
public int id; 
public String name; 

User(int id, String name) { 
    this.id = id; 
    this.name = name; 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

}

但是,使用地圖是可取的!