2013-03-31 74 views
1

我在解釋事情上真的很糟糕,但我會盡我所能。尋找重複的字符索引

我正在製作一個小程序,可以在輸入時將一個單詞轉換爲另一個單詞。鍵入的每個字母都會經過這段代碼,根據其整個單詞的索引位置將其更改爲不同的字母。

這裏我的問題是,當有重複的字母時,重複的字母不會根據它們在單詞中的位置而改變,而是第一次出現。

例如,這構成單詞「bacca」。如果你通過代碼,它應該改變爲「vrwiy」,而是改爲「vrwwr」。我知道這是爲什麼。這是因爲switch語句遍歷需要轉換的單詞。然而,我不知道如何根據字符串索引內的各個位置更改每個字符。我想也許LastIndexOf()方法會起作用,但它只是顛倒了順序。因此,如果我要輸入字母「a」,它會顯示爲「n」,但如果我輸入「aa」,則會將第一個「a」切換爲「r」,因爲第二個位於IndexOf 1個變成了「r」。

private void inputTbox_TextChanged(object sender, EventArgs e) 
{ 
    List<string> rawZnWordList = new List<string>(); 
    foreach (char a in inputTextBox.Text) 
    { 
     switch (inputTextBox.Text.IndexOf(a)) 
     { 
      case 0: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("n"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("v"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("a"); 
         continue; 
        default: 
         break; 
       } 

       continue; 
      case 1: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("r"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("x"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("z"); 
         continue; 
        default: 
         break; 
       } 
       continue; 
      case 2: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("t"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("l"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("w"); 
         continue; 
        default: 
         continue; 
       } 
       continue; 
      case 3: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("u"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("i"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("o"); 
         continue; 
        default: 
         break; 
       } 
       continue; 
      case 4: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("y"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("m"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("d"); 
         continue; 
        default: 
         break; 
       } 
       continue; 
      default: 
       break; 
     } 
    } 
    string finalZnWord = string.Join("", rawZnWordList.ToArray()); 
    outputTextBox.Text = finalZnWord; 
} 

回答

1

你應該嘗試使用for循環,而不是像這樣:

for (int i = 0; i < inputTextBox.Text.Length; i++) 
    { 
     char a = inputTextBox.Text[i]; 
     switch (i) 
     { 
      case 0: 
       switch (a) 
       ... 

希望這有助於;)。

+0

謝謝,這個作品完美。我認爲也許for循環會解決它,但我不知道如何格式化它。 –

0

你需要保持你的foreach內,而不是使用.IndexOf跟蹤指數。您也可以使用常規的for循環代替foreach,但這種方式對代碼的修改很小。

private void inputTbox_TextChanged(object sender, EventArgs e) 
{ 
    List rawZnWordList = new List(); 
    int index = 0; 
    foreach (char a in inputTextBox.Text) 
    { 
     switch (index) 
     { 
      case 0: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("n"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("v"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("a"); 
         continue; 
        default: 
         break; 
       } 
       continue; 
      case 1: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("r"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("x"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("z"); 
         continue; 
        default: 
         break; 
       } 
       continue; 
      case 2: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("t"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("l"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("w"); 
         continue; 
        default: 
         continue; 
       } 
       continue; 
      case 3: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("u"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("i"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("o"); 
         continue; 
        default: 
         break; 
       } 
       continue; 
      case 4: 
       switch (a) 
       { 
        case 'a': 
         rawZnWordList.Add("y"); 
         continue; 
        case 'b': 
         rawZnWordList.Add("m"); 
         continue; 
        case 'c': 
         rawZnWordList.Add("d"); 
         continue; 
        default: 
         break; 
       } 
       continue; 
      default: 
       break; 
     } 
     index++; 
    } 
    string finalZnWord = string.Join("", rawZnWordList.ToArray()); 
    outputTextBox.Text = finalZnWord; 
}

+0

謝謝,我確實需要切換通過循環檢查的內容。我決定使用for循環而不是foreach。 –

0

我認爲這是做同樣的事情,是更多的可讀性。當然用你自己的價值取代字母環。我只有5個字符。我猜你會想要更多。

//replacement letter rings 
char[][] aRep = { 
    "xfhygaodsekzcpubitlvnjqmrw".ToCharArray(), 
    "wqtnsepkbalmzyxvordhjgifcu".ToCharArray(), 
    "nyxgmcibplovkwrszaehftqjud".ToCharArray(), 
    "soqjhpybuwfxvartkzginemdcl".ToCharArray(), 
    "pldquhegkaomcnjrfxiysvtbwz".ToCharArray(), 
}; 
private string newText(string inVal) 
{ 
    char[] ia = inVal.ToCharArray(); //in array 
    int l = ia.Length; 
    char[] oa = new char[l]; //out array 
    for (int i = 0; i < l; i++) 
     oa[i] = aRep[i][(int)ia[i]-97]; //lowercase starts at char97 
    return new string(oa); 
} 

這裏也是我用來生成環代碼:

//generate random letter rings 
//char[] ascii = "abcdefghijklmnopqrstuvwxyz".ToCharArray(); 
//for (int i = 0; i < 8; i++) 
// new string(ascii.OrderBy (x => Guid.NewGuid()).ToArray()).Dump(); 

我做了一些很簡單的測試,這似乎頗有幾分比原來的方法更快,更重要的是(對我來說)它更方便閱讀,更容易看到你的替換字母序列。我認爲還有更多優化需要完成,但我認爲這是一個好的開始。只需在「更改」時將其與您的文字一起調用即可。