2013-05-29 19 views
3

我有676對字母的,並沒有重複的字符串列表:(AA,AB,AC ... ZW,ZX,ZZ字符映射的兩份名單,使它們相互

我有與同676對第二串名單,但他們現在正在洗牌:(GH,KI,RT ... WE,SD,BB

我需要在這兩個列表的每個元素映射這樣的方式它們會相互但不一樣(不能有BB = BB等)。

AA = GH 
AB = KI 
AC = RT 
. 
. 
GH = AA 
. 
. 
KI = AB 
. 
. 
RT = AC 

對於每個字母組(A *,B *,C * ...),只有一個映射對可以以相同的字母開頭。 (例如,您可以有CD = CH,DH = DE,但不是CD = CH,CE = CY ...)

我被困在如何檢查每個元素(可能是洗牌第二個列表)確保它們在兩個列表上都匹配。任何想法如何做到這一點?謝謝!

+0

你說'只有一個映射對可以以同一個字母開始',但是那些不以雙側同一個字母開頭的對呢?只要你喜歡,你可以擁有多少人? – Patashu

回答

2

1)取第一個列表。另外,創建一個長度爲26個條目的布爾數組,每個字母字符一個。這將用於指示該字符的相同字母對是否已被使用。另外,製作字符串到字符串的映射。

2)從列表中隨機選取兩個元素。如果它是一個OK對(不是同一個條目兩次,沒有選擇一個同樣的字符,我們已經完成了一個起始對),將兩個方向添加到地圖+如果它是一個相同的字符起始對,則標記其對應的字符字符條目在布爾數組中。

4)如果列表現在爲空,則轉到5)。如果我們已經超過了魔術數量(例如2000或3000),請回到1)並重新開始。否則轉到2)。 (這是因爲有時候我們最終會遇到一個無法解析的結局,例如,當我們已經有一個C起始對並因此不能再添加更多時,只有C起始條目)

5)將地圖解釋爲列表string,string元組,按字母順序排列第一個字符串,並將每個元組解壓縮到兩個列表中。第一個列表將是列表A,第二個列表將是列表B.您將只有完美的倒數,並且任何字母不超過一個相同的字母對。

+0

謝謝Patashu,您的解決方案解決了問題!現在我看到了如何去做。比我想象的要簡單得多。 –

0

嘗試這樣:

int count = l1.Count; 
Dictionary<string, string> dict = new Dictionary<string, string>(); 

for (int i = 0; i <= count; i++) { 
    string s1 = l1(i); 
    string s2 = l2(i); 

    if (!s1.Equals(s2)) { 
     if (!s1[0].Equals(s2[0])) { 
      dict.Add(s1, s2); 
     } else { 
       //magicMethod(); 
       } 
    } else { 
     //magicMethod(); 
    } 
} 

L1和L2是你的清單。

+0

魔法有什麼用? – Patashu

+0

無論OP在價值相等的時候都希望它做什麼......他的問題沒有具體說明那部分...... –

0

假設兩個列表具有相同的長度。你可以這樣實現:

var list = new List<KeyValuePair<string, string>>(); 
for (int i = 0; i < length; i++) 
{ 
    list.Add(new KeyValuePair<string, string>(keyList.ElementAt(i), valueList.ElementAt(i)); 
} 
+0

這是如何確保'他們會是互惠但不一樣'? – Patashu

相關問題