2013-03-31 38 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(); 

我做了一些很简单的测试,这似乎颇有几分比原来的方法更快,更重要的是(对我来说)它更方便阅读,更容易看到你的替换字母序列。我认为还有更多优化需要完成,但我认为这是一个好的开始。只需在“更改”时将其与您的文字一起调用即可。