3-Wege-mischen implementieren

Status
Nicht offen für weitere Antworten.

Ravebaby

Mitglied
Hallo zusammen,

mein Ziel ist es, ein 3-Wege-Mischen zu implementieren. Also möchte ich gerne 2 vorhandene Modelle (Model1 und Model2) mit Hilfe eines dritten Referenz-Models synchronisieren / mergen. Erst einmal möchte ich eine sog. "ActionList" anzeigen, die mir den Zustand der beiden zu synchronisierenden Modelle anzeigt und mir zudem die geplante Aktion anzeigt.
Wenn also ein Element im Referenz-Model "A" heißt, im Model1 "A" und im Model2 "B" soll die Oberfläche ein Umbenennen in "B" vorschlagen.

Ich denke, um diese 3 Modelle wirklich abgleichen zu können, muss ich erst einmal deren Inhalte sortieren und zwar nach dem, was eindeutig ist. In meinem Fall ist das der Name der einzelnen Elemente. Dazu wollte ich eine Art sortableModelAdapter für meine Models schreiben. Allerdings finde ich nur ein Comparable Interface. Gibt es denn da eine sinnvolle vorgehensweise um mein Vorhaben umzusetzen (bevor ich mich da nun blind und wild verlaufe ;o)

Danke schonmal für jede Antwort!!
Grüße Rave
 
Na 3 Wege mischen = Bigmac, 3 toast 2 fleisch 1 gurkenscheibe = Mischen Impossible :autsch:
... keine Ahnung

Ich versteh dazu noch den Zusammenhang mit der Erklärung nicht ganz, in etwa was gemeint ist, aber Sinn und Zweck und etwas genauerer Kontext fehlt.
 
Ach dann bin ich ja auch irgendwie froh ;o) Neulich hatte nur einer gemeint, dass 3-Wege-Mischen sei so alt und grundsätzlich, dass es jeder kenne... und dann hab ich mich nich getraut hier so viel unnützes Zeuch zu schreiben ;o)

Also das 3-Wege-Mischen wird z.B. auch für den Abgleich zwischen einem Palm und Outlook benutzt. Es ist ein Synchronistaionsmechanismus, der für die Sync 3 Instanzen eines Datenmodells benutzt.
Sprich ich möchte gerne 2 Modelle vergleichen (Model1 und Model2) und dafür ein drittes (Model3) zur Hilfe nehmen. Dieses dritte Modell enthält den Zustand der beiden anderen nach der letzten efolgreichen Synchronisation.
Das 3-Wege-Mischen gleicht dann die beiden modifizierten Modelle mit Model3 ab und geht standardmäßig folgendermaßen vor: Ist ein Element in Model1 und in Model3 vorhanden, nicht aber in Model2, ist ersichtlich, dass dieses Element bei der letzten Sync schon vorhanden war und folglich in Model2 gelöscht wurde. Deshalb schlägt das 3-Wege-Mischen auch ein Löschen in Model1 vor. Ist jedoch ein Element nur in Model1 vorhanden und weder in Model2 noch in Model3, kann man sehen, dass es bei der letzten Sync noch nicht da war --> also wurde es in Model1 eingefügt und der Mechanismus schlägt auch ein Einfügen in Model2 vor. Usw.... (ich hoffe, ich hab es irgendwie verständlich ausgedrückt...)

Nun zu meinem Problem:
Meine beiden Modelle und auch Model3 haben denselben Aufbau. Sie enthalten alle Attribute, Attribut Typen und Sichten, die wiederum Attribute enthalten. Z.B. hat ein Attribut ein Attribut "Namen", einen "Typ", einen "minimalen und maximalen Wert".
Eindeutig ist bei den jeweiligen Elementen der Name. Deshalb dachte ich, dass ich mir erst einmal die Attribute der 3 Modelle hernehme und jeweils nach Namen sortiere, damit ich dann auch abgleichen kann. Dies wollte ich über die Implementierung eines Sortable Intefaces in einem ModelAdapter tun. Allerdings habe ich nun nur ein Comparable gefunden... Das Comparable brauch ich vielleicht ja auch, weil ich dann irgendwie die jeweiligen Attribute des Attributes vergleichen muss.
Sprich ich weiß nicht so genau wo und wie ich nun wirklich anfangen soll und ob mein Vorhaben in Ordnung ist, oder ob es vielleicht schon eine gewisse Vorgehensweise bei so etwas gibt.
 
Ahh okay - jetzt verstehe ich....

Interessant wird es also, wenn ein Element in allen 3 Modellen verschieden ist, also in Model 1 und 2 geändert wurde - dann muss man sich für eine Version entscheiden bzw mergen.... 🙂

Geht's Dir jetzt darum, wie Du eine Liste von allen Elementen erstellst?

Also "adhoc" würde ich das so machen:


Code:
Element E (Name, Wert in ModelA, Wert in ModelB, Wert in ModelC)

Liste L;

Für jedes Element E in ModelA:
	- füge E und den zugehörigen ModelA-Wert in L ein.
	- wenn E in ModelB enthalten ist, speichere den ModelB-Wert von E in L.
	- wenn E in ModelC enthalten ist, speichere den ModelC-Wert von E in L.
	
Für jedes Element E in ModelB:
	- wenn E nicht in L enthalten ist:
			- füge E und den zugehörigen ModelB-Wert in L ein.
			- wenn E in Model C enthalten ist, speichere den ModelC-Wert von E in L.
			
Für jedes Element E in ModelC:
	- wenn E nicht in L enthalten ist:
			- füge E und den zugehörigen ModelC-Wert in L ein.
			
//jetzt hat man in der Liste also alle Elemente die in mindestens 1 Model vorkommen.

//jetzt das Zusammenführen:

Für jedes Element E in L:
	- wenn WertA = WertC != WertB:
		- WertA = WertB
		- WertC = WertB
		//...usw....
 
Vielen Dank für die Antowort, aber nein, so möchte ich das nicht machen.
Mein Ziel ist es, eine Synch Oberfläche zu programmieren die auf der linken Seite die Werte der Elemente in Model1 und auf der rechten Seite die Werte in Model2 anzeigt. Dazwischen gibt es dann eine Spalte die die jeweilige Sync-Aktion vorschlägt. Also zB --> um den linken Wert in das rechte Model zu übernehmen und umgekehrt.
X, wenn das Element zB links nicht mehr vorhanden ist und auch rechts gelöscht werden soll.
Somit habe ich dann links und rechts einen Baum mit allen, neuen, modifizierten oder gelöschten Elementen (zumindest möchte ich das haben 😉
 
Ravebaby hat gesagt.:
Neulich hatte nur einer gemeint, dass 3-Wege-Mischen sei so alt und grundsätzlich, dass es jeder kenne...
Also die Synchronisation die du beschreibst ist schon Grundwissen, aber der Begriff 3 Wege Mischen verwirrt einen dann doch.

Das Problem was ich habe ist, dass ich weder die Form deiner Klassen kenne, also in wie weit verzweigen sich diese (muss man quasi per Rekursion in die Tiefe gehen?), noch kenne ich die Art wie diese gehalten werden (Liste, Baum, etc).

Falls diese als einfache ungeordnete Liste vorhanden sind, dann gibt es da eine schlechte triviale Lösung.
1 HashMap füllen, ... Vergleichsschlüssel, z.B. der Name, auf ein Array Model[3] abbilden, oder noch besser über folgendes implementieren:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#hashCode()
Und danach einfach die Liste durchgehen, also für jeden Punkt schauen wie das Array aussieht, bzw. welche Einträge vorhanden sind.

Nur wie gesagt, besser du setzt hier noch ein paar Klassen rein und zeigst in welcher Form die Modelle vorhanden sind.
 
Also jedes Attribut oder AttributTyp ist eine Instanz einer Klasse.
Die Attribute eines Attributes wie Name, Typ, min und max Wert sind einfache Attribute einer Instanz von "Attribut".#
Sorry, das mit den Attributen der Attribute ist vielleicht ein etwas verwirrendes Beispiel...
Also dachte ich mir, ich schreib für alle möglichen Instanzen erst einmal ein sortable Interface. Also für die Attribute ein AttributesSortableModelAdapter der alle Attribute nach Namen sortiert. Dann brauch ich wahrscheinlich noch ein Comparable Interface oder so. Irgendwie muss ich ja herausfinden bei welchen Attributen sich überhaupt was geändert und und was genau... Und daraus möchte ich dann meine Synchronisationsliste anzeigen. Oh man, je länger ich drüber schreibe, desto mehr Angst bekomme ich davor 🙁
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben