2 Vectoren vergleichen - Vereinigungsmenge bildern

drob

Mitglied
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)
 
hier ein kleine Testumgebung,

Code:
    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:
Code:
 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
 
Hallo,

also, wenn ich dich richtig verstanden habe müsste das hier reichen, das erzeugt die Vereinigungsmenge im Vector v:
Code:
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.
 
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.
 
@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.
 
:-)
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* ;-)

Code:
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...
)
 
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)
 

Neue Beiträge

Zurück