简化物品更换链的逻辑
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);
我有一些物品正在被其他物品替换,因此创建了一个替换链:
+---------------+------------------+ | 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);