2016-03-18 20 views
0

Bir dizge oluşturuyorum (dizede 2 harf için (aa, ac, bh, is) gibi), özel karakter yok, metinde boşluk yok varsayalım. sadece alfabe. döngü adildir içinDizgede ardışık harf çiftleri sayma

 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 

      } 
     } 

yüzden saymak [] [] içinde ... vb

açıklamada ab 5, aa 10 gibi metin alfabeler tüm çiftinin olay sayısını hv n olur yapılması gerekenler hakkında bir fikir vermek. foreach döngüsünü kullanmayı düşünüyordum ama foreach'da iki karakter okuyamıyorum. Ben lol 26x26 = 676 durumları yazmak zorunda kalacak anahtarı ama anahtarı kullanabilirsiniz i dizesinden 2 karakter okuma nasıl

burada saplanıp .. ?

cevap

0

Regex kullanarak böyle bir şey deneyin.

 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; 
      } 
     } 

Not Davayı görmezden olarak RegexOption koyduk ancak küçük harfe duyarlı isterseniz kaldırabilirsiniz.

1

Dizilerinizdeki tüm sayıları saymak LINQ kullanırsanız kolay bir çözüm olur. Dizede dizeyi ayırmak ve içinden yinelemek için kullanabileceğiniz dizgede Split yöntemi vardır.

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

i Linq bilmiyorum:/ n i ... ama teşekkür ur yardım için bir sürü :) yazılım geliştirme geleceğiniz için iyiye işaret değil –

+1

@VishalSingh anlamıyorum şey kullanmak istemiyorum. –

+1

@VishalSingh, anlamadığınız bir şeyi denemek için korkmayın, bunu nasıl anlayabilirsiniz! – allie

0

LINQ yanıtına benzer ancak LINQ olmadan. Bu, iki harf çiftiyle anahtar olarak bir sözlük ve sayım olarak bir int kullanır.

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); 
     }