简化物品更换链的逻辑

Logic to simplify item replacement chain

我有一些物品正在被其他物品替换,因此创建了一个替换链:

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

如果我们简化它的关系链,我们发现
A -> B -> C -> D
& G -> H

最后,我想实现简化的输出table喜欢:

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

我的问题是: 在javascript/java/ruby等API中是否有解决此类链简化问题的现有API或算法

我试过的是: 我想我可以通过使用 Java 引用来解决它。 当我们将一个引用分配给另一个引用时,两个引用将指向同一个对象,因此对象 ID 将相同。 我创建了几个参考:

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

我从 ref.hashCode() 方法中得到哈希码。

//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
//----

现在我需要遍历所有引用并将哈希码放入包含唯一值的 set 中。所以我只有65和71。

现在, 65 -> A、B、C、D 和优先级 D 是最后一个元素。 71 -> G,H 优先级 H 是最后一个元素。

所以我可以总结为:

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

你可以通过一些简单的递归得到一个新的"map":

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