2012-04-03 11 views
0

Ich brauche kleine Hilfe. Ich habe 2 Listen (sagen wir A und B), die Objekte einer benutzerdefinierten Klasse haben.Logik Hilfe benötigt für die Listenbearbeitung in Java

Sowohl A als auch B haben eine Methode getId(), die eine ganze Zahl (ID) zurückgibt. Jetzt muss ich die ID jedes Objekts in Liste A mit jedem Objekt von Liste B vergleichen. Wenn die ID identisch ist, muss ich dieses Objekt von B durch das von A ersetzen.

Wenn die ID von das Objekt von A in B nicht, dann würde ich das Objekt hinzufügen, mir B

Bitte geben Sie eine Logik auf, wie diesen

Dank

+0

Ich habe versucht, dies http://stackoverflow.com/questions/9977658/concurrentmodificationexception-help-in-iterator#comment12748686_9977658 – jeyaprakash

+0

Aber das Problem ist, dass es für jedes Objekt in A mit allen Objekten in B und Wenn es nicht das gleiche ist Hinzufügen der Objekte immer wieder – jeyaprakash

+0

Ich möchte nur sehen, ob B das aktuelle Objekt in A enthält, wenn ja, dann ersetzen Sie das Objekt mit diesem anderen einfach hinzufügen – jeyaprakash

Antwort

3

So etwas wie dies funktionieren würde, Ihre Liste der Annahme ist eine Arraylist mit der Möglichkeit, Elemente für den Zugriff mit einem Index

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));  
      } 
} 

Diese requiers, dass Ihre Elemente in a und b die Gleichen statment außer Kraft setzen, also können sie vergleichen die ID mit einander

+0

danke, aber das Problem ist angenommen, die Liste A hat {1,2,3} (betrachten 1,2,3 sind die IDs des Objekts) und B hat {5,6,7}, jetzt wird 1 mit verglichen werden 5 und es wird nicht übereinstimmen und wird zu B hinzugefügt, und wieder wird 1 mit 6 verglichen und wieder würde es hinzugefügt werden, und es geht weiter, was ich brauche, wenn B ein Objekt von A enthält, dann muss es ersetzt werden mit A, oder einfach nur hinzufügen – jeyaprakash

+0

Oh, Sie haben Recht damit. Eine Lösung wäre, zu brechen; in der else-Anweisung. Dies würde aus der inneren Schleife herausbrechen, was bedeutet, dass die erste Schleife und setze i auf 1.Also, wenn Sie wie gesagt a = {1, 2, 3} und b = {5,6,7} haben, dann wird 1 mit 5 verglichen, keine Übereinstimmung, also fügt es 1 zu b hinzu, bricht aus der Schleife und jetzt aus 2 wird mit 5 verglichen, was du willst –

+0

Ich schätze deine Hilfe wirklich Jimmy, das ist eine gute Logik, aber es gibt eine kleine Schleife Loch, wenn angenommen, b = {5,6,7,1}, wird 1 überprüft werden mit 5 und es wird ausbrechen. Aber es gibt ein Match auf der vierten Position. :( – jeyaprakash

2

achive Warum Sie Hashtable nicht von List anstelle verwenden . Sie können ID als Schlüssel für jedes Objekt angeben.

+1

Unter der Annahme, dass die ID für die beteiligten Objekte eindeutig ist, ist dies ein ausgezeichneter Vorschlag. – user949300

1

Sie sollten eine Schnittstelle für die getID() -Methode:

public interface Identity {  
    public long getID(); 
} 

Und jetzt machen wir den Trick beiden Listen synchronisieren:

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 
} 

ich davon aus, dass equals() werden nicht überschrieben für deine Objekte!

1

Beispielprogramm, das ich erstellt hatte. Hoffe, das könnte helfen.

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()); 

} 

und Klasse Mitglied ist:

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; 
} 

}

Aber Karte mit ratsam ist !!!