计算字符串中的连续字母对

时间:2016-03-18 21:54:53

标签: c# string count

我正在创建一个图表(字符串中的2个字母的频率(如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

            }
        }

所以count [] []会显示文本中所有字母对的出现次数 像aa 10,ab 5 n等...

for循环中的语句只是为了说明需要做什么。 我正在考虑使用foreach循环,但我们无法读取foreach中的两个字符。 我可以使用开关但在开关中必须写26x26 = 676个案例lol

被困在这里.. 我怎么从字符串中读取2个字符?并在整个字符串中计算它们的出现次数

3 个答案:

答案 0 :(得分: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);
        }
    }
}

答案 1 :(得分: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设置为忽略大小写,但如果您想要区分大小写,则可以将其删除。

答案 2 :(得分: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);
        }