2017-05-11 1 views
2

Ich habe einige Elemente zu vereinfachen, die somit durch andere Elemente ersetzt werden eine Ersatzkette zu schaffen:Logic Artikel Ersatzkette

 
+---------------+------------------+ 
| Replaced Item | Replacement Item | 
+---------------+------------------+ 
| A    | B    | 
| B    | C    | 
| C    | D    | 
| G    | H    | 
+---------------+------------------+ 

Wenn wir vereinfachen es Beziehung Ketten wir als
A gefunden -> B - > C -> D
& G -> H

Schließlich möchte ich Ausgabe als vereinfachte Tabelle wie erreichen:

 
+---------------+------------------+ 
| Replaced Item | Replacement Item | 
+---------------+------------------+ 
| A    | D    | 
| B    | D    | 
| C    | D    | 
| G    | H    | 
+---------------+------------------+ 

Meine Frage ist: Ist eine vorhandene API oder Algorithmus diese Art von Ketten Vereinfachung Problem in JavaScript/Java zu lösen/Rubin usw.

Was ich versucht ist: Ich dachte, ich könnte lösen es unter Verwendung von Java-Referenzen. Wenn wir einen Verweis auf einen anderen Verweis zuweisen, so verweisen beide Referenzen auf dasselbe Objekt. Daher wird die Objekt-ID identisch sein. Ich habe mehrere Referenzen erstellt als:

String ref1 = "A"; 
String ref2 = "B"; 
String ref3 = "C"; 
String ref4 = "D"; 
String ref5 = "G"; 
String ref6 = "H"; 

bekam ich Hashcodes von ref.hashCode() Methode.

//A = 65 
//B = 66 
//C = 67 
//D = 68 
//E = 71 
//F = 72 
//---- 

// Now A --> B means 
ref2 = ref1; 
//A = 65 
//B = 65 
//C = 67 
//D = 68 
//E = 71 
//F = 72 
//---- 

// Now B --> C means 
ref3 = ref2; 
//A = 65 
//B = 65 
//C = 65 
//D = 68 
//E = 71 
//F = 72 
//---- 


// Now C --> D means 
ref4 = ref3; 
//A = 65 
//B = 65 
//C = 65 
//D = 65 
//E = 71 
//F = 72 
//---- 

// Now C --> D means 
ref6 = ref5; 
//A = 65 
//B = 65 
//C = 65 
//D = 65 
//E = 71 
//F = 71 
//---- 

Jetzt müsste ich durch alle Verweise auf laufen und setzen Hashcodes in eine gesetzt die eindeutige Werte enthält. also habe ich nur 65 und 71 bekommen.

Jetzt, 65 -> A, B, C, D und präzedenzweise D ist das letzte Element. 71 -> G, H Vorrang H ist das letzte Element.

so schließe ich, könnte es als:

 
+---------------+------------------+ 
| Replaced Item | Replacement Item | 
+---------------+------------------+ 
| A    | D    | 
| B    | D    | 
| C    | D    | 
| G    | H    | 
+---------------+------------------+ 
+0

Erm ... Warum nicht einfach Erstellen Sie jede Kette als Liste und verwenden Sie dann das erste und letzte Element als neue Tabelle? –

+0

(Mit einem Zyklus überprüfen .....) –

+0

Also, Apoorv, beantwortet meine Antwort Ihre Frage? – Cerbrus

Antwort

0

Sie können eine neue "Karte" mit einigen einfachen Rekursion erhalten:

var replacements = { 
 
     A: 'B', 
 
     B: 'C', 
 
     C: 'D', 
 
     G: 'H' 
 
    }, 
 
    map = {}; 
 

 
function replace(letter){ 
 
    if(!replacements[letter]) // If the replacements don't contain the current letter, 
 
     return letter;   // Just use the current letter 
 
    return replace(replacements[letter]); // Otherwise, get the replacement letter. 
 
} 
 

 
for(var key in replacements){ // 'key' being: A, B, C, G 
 
    map[key] = replace(key); // Assign a new replacement value in the map. 
 
} 
 

 
console.log(map);

+0

Danke für die brillante Antwort. Ich habe versucht, es als disjoint Set Data Structure in Java zu implementieren. Das sieht viel einfacher aus. –

+0

Es schlägt nur fehl, wenn das Ersatzelement dieselbe Variable wie * "A -> A" * ist, aber wir können diese Elemente vorher entfernen, da diese Ersetzungen keinen Sinn ergeben. –