简化项目替换链的逻辑

时间:2017-05-11 13:24:12

标签: javascript java ruby simplification

我有一些项目被其他项目替换,因此创建了一个替换链:

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

如果我们简化它的关系链,我们发现为     A - > B - > C - > d
    &安培;     G - > ħ

最后,我希望以简化表格的形式实现输出:

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

我的问题是: 是否有任何现有的API或算法来解决javascript / java / ruby​​等中的这种类型的链简化问题。

我尝试的是: 我以为我可以通过使用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                |
+---------------+------------------+

1 个答案:

答案 0 :(得分:0)

您可以使用一些简单的递归来获取新的“地图”:

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