2016-03-18 3 views
0

Я создаю диаграмму (частота для двух букв (например, aa, ac, bh, is) в строке) Предположим, что в тексте нет специальных символов, пробелов нет. только алфавиты.Подсчет последовательных буквенных пар в строке

 string text; 
     char char1[]= {a,b,c,....z}; //26 alphabets 
     int[][] count=null; 
     for (i = 0; i < 26; i++) 
     { 
      for (j = 0; j < 26; j++) 
      { 
       count[i][j] = text.Count(char[i]char[j]); <---- this is the problem 

      } 
     } 

так подсчитывать [] [] будет Нч число вхождений всех пар алфавитов в тексте как аа 10, аб 5 п так далее ...

заявление в течение цикла просто чтобы дать представление о том, что нужно сделать. Я думал об использовании цикла foreach, но мы не могли прочитать два символа в foreach. Я могу использовать переключатель, но в переключателе придется писать 26x26 = 676 случаев lol

застрял здесь .. как я могу прочитать 2 символа из строки? и подсчитывать их вхождения во всей строке

ответ

0

Попробуйте что-нибудь подобное с помощью Regex.

 string text = "aabbcc"; 
     char[] char1 = { 'a', 'b', 'c' , 'z' }; //26 alphabets 
     int[,] count = new int[char1.Length, char1.Length]; 

     for (int i = 0; i < char1.Length; i++) 
     { 
      for (int j = 0; j < char1.Length; j++) 
      { 
       count[i,j] = Regex.Matches(text, string.Concat(char1[i],char1[j]), RegexOptions.IgnoreCase).Count; 
      } 
     } 

Примечание Я поставил RegexOption, как игнорировать случай, но вы можете удалить его, если вы хотите, чувствительны к регистру.

1

Если вы используете LINQ, это станет простым решением. Существует метод Split в строке, который вы можете использовать для разделения строки в массиве и повторения ее.

using System; 
using System.Linq; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     string text = "this is a ss and mm is not to be count an me"; //Input string 

     // Find only 2 letter strings 
     List<string> allTwoLetters = text.Split(new Char[]{' '}).Where(x=>x.Length==2).ToList(); 


     //Find all Distinct strings in two letter string list 
     List<string> distinctStrings = allTwoLetters.Distinct().ToList(); 

     //dictionary to hold result 
     Dictionary<string,int> letterCount = new Dictionary<string,int>(); 

     //Iterate throug each string in distinct string and count how many such strings are there i two letter list of strings 
     foreach(string current in distinctStrings) 
     { 
      letterCount.Add(current,allTwoLetters.Where(p=>p == current).ToList().Count); 
     } 

     //Output values 
     foreach(var kvp in letterCount) 
     { 
      Console.WriteLine(kvp.Key + " - "+ kvp.Value); 
     } 
    } 
} 
+0

я не знаю, Linq:/ п не хотите использовать что-то я не понимаю ... , но спасибо большое за помощь ур :) –

+1

@VishalSingh, что не сулит ничего хорошего для будущего в разработке программного обеспечения. –

+1

@ VishalSingh, не бойтесь попробовать что-то, чего вы не понимаете, вот как вы это понимаете! – allie

0

Как и LINQ, но без LINQ. Это использует словарь с двумя буквами в качестве ключа, а int - как счетчик.

string text ="asasdfasdf"; 
     char[] alphabet = "abcdefghijklmnopqrstuvwxyz".ToCharArray(); 
     Dictionary<string,int> letterCombos = new Dictionary<string,int>(); 
     for (int i = 0; i < 26; i++) 
     { 
      for (int j = 0; j < 26; j++) 
      { 
       letterCombos.Add(alphabet[i] + alphabet[j].ToString(), 0); 
      } 
     } 
     char[] textCharArray=text.ToCharArray(); 
     for (int i =0;i<text.Length-1;i++) 
     { 
      string partial = textCharArray[i] + textCharArray[i + 1].ToString(); 
      letterCombos[partial]++; 
     } 
     foreach (KeyValuePair<string, int> kp in letterCombos) 
     { 
      Console.WriteLine(kp.Key +": "+kp.Value); 
     } 
Смежные вопросы