# 2 Vectoren vergleichen - Vereinigungsmenge bildern



## drob (30. Juli 2007)

Ich lade zyklisch Daten in einen Vector;
Diese aktuellen Daten sollen in ein Archiv(andere Vector) importiert werden.

Leider überlappen die Daten der Vectoren, 
und ich suche nacheiner gescheiten Art und 
Weise den Datenbestände abzugleichen.

Vereinigungsmenge zweier vektoren Bildern 
nachzulesen bei --> 
http://de.wikipedia.org/wiki/Mengenlehre
(die grafik zur Vereinigungsmenge sagt alles)


----------



## drob (31. Juli 2007)

hier ein kleine Testumgebung,


```
public static final void main(String[] args) {
        Vector<Integer> vtOld = new Vector();
        Vector<Integer> vtNew = new Vector();
        vtOld.add(0);
        vtOld.add(1);
        vtOld.add(2);
        vtOld.add(3);
        vtOld.add(4);
        vtOld.add(5);
        vtOld.add(6);
        vtOld.add(7);
        
        vtNew.add(5);
        vtNew.add(6);
        vtNew.add(7);
        vtNew.add(8);
        vtNew.add(9);
        
        
        for(int i = 1 ; i<=vtNew.size();i++){
            int length = vtOld.size();
            System.out.println(" "+ i +" "+
                    vtOld.containsAll(vtNew.subList(0,i)));
        }
```
ergebnis:

```
1 true
 2 true
 3 true
 4 false
 5 false
```
die mir zumindest sagt, wieviel meiner neuen Daten ich schon habe, 
und mit dem wert sollte ich doch schon was anfangen können.

lösungsansätze jeder art sind wilkommen


----------



## celph_titled (31. Juli 2007)

Hallo,

also, wenn ich dich richtig verstanden habe müsste das hier reichen, das erzeugt die Vereinigungsmenge im Vector v:

```
Vector v = vtOld.clone();
Enumeration e = vtNew.elements();
while(e.hasMoreElements()) {
   Object o = e.nextElement();
   if(!vtOld.contains(o)) vtOld.addElement(o);
}
```
praktisch alle Elemente aus vtNew zu vtOld hinzufügen, die der noch nicht enthält.


----------



## magix3000 (31. Juli 2007)

Hallo,

wenn du doch sowieso schon von Mengenleere sprichst, dann benutz doch auch ein Set statt eines Vectors. In ein Set kannst du einfach alle neuen Daten reinwerfen ohne dir Gedanken um Doppelte machen zu müssen. Ist allerdings nur ne Option, wenn die Reihenfolge der Daten keine Rolle spielt. Denn die obige Lösung mit dem Überprüfen mittels contains() ist nicht wirklich performant, da contains auch jedesmal komplett über deinen Vektor läuft.


----------



## drob (31. Juli 2007)

@celph_titled
mit Enumeration habe ich noch nciht gearbeitet, aber doppelte Werte sollen zulässig sein.
daher habe ich auch in meiner lösung nach "teilmustern" des Vektors gesucht.

@magix3000	
leider spielt die reihenfolge eine rolle(die Mengenlehre galt nur der Veranschaulichung),
Das das contains sehr rechenintensiv wird, das habe ich mir auch schon gedacht 
Besonders, wenn nacheinem langen tag der "Archiv-Vector" mehr als 10000 Objekte enthält kann.

Ein Schritt der Optimierung(für die Vrwendung des contains) wäre von dem Archivector das 
letzte Teilstück zu verwenden, um dann zu bestimmen wo man diesen abschneidet/kürzt,
und dann anschliessend den neuen Vektor anhängt.


----------



## drob (31. Juli 2007)

ich will ja nicht sagen "ich habs" aber ;-) ich habs ...

ich entferne einfach "blind" alle elemente aus dem Archiv,
die in meinem neuem Vector enthalten sind,
und füge dann den neuen Vector an das archiv an 

*brilliant* ;-) 


```
vtOld.removeAll(vtNew);
        vtOld.addAll(vtNew);
```
thatsall;-)

selbst doppelte Werte werden einfach neu angehängt,
und die reihenfolge sollte auch bestehen bleiben, da 
der neue vector ja unverändert ist/bleibt. 

(ungünstige konstellation mit doppelten werten könnte nur zu fehlern führen...
*grübel*;
ein Wert ist eigendlich 2mal vorhanden aber im neuen Vector nur einmal drin...
)


----------



## drob (1. August 2007)

ein Zusatz für alle die Vectoren mit eigenen Klassen füllen,

nicht vergessen die Methode "public boolean equals(Object o)" in der eigenen Klasse zu implementieren, sonst "geht dem nicht" ;-) ( und ihr sucht den Fehler)


----------

