2016-09-25 6 views
1

私は整数kに基づいてテキストファイルを文字列に分割し、同じ文字列が何回ポップアップしたのかをカウントしたいと思います。現時点では、文字列を別々の部分文字列に分割していますが、各文字列を読み込んで一意の部分文字列を数えないように順序付けられていないマップを取得することはできません。ハッシュテーブル(順序付けられていないマップ)を使用して一意の部分文字列値を分割してカウントする方法は?

サンプルテキストファイルは、最初の3位は、ファイル内のその多くの行があるなら、私に確認することができますどのくらいの各部分があり、第二3である。この

3 3 
ACTG 
ACTG 
ACTG 

ようになります。

文字列は次のようになりストリングに分割されます:

ACT, CTG,TGA,GAC... and so on. 

私は、同じ値が現れる回数をカウントするようにしようとしていますが、それを適切に行うように見える傾けます。

私の唯一の2つの問題は、実際にそれらの文字列を読み込んで、一意の値が何回表示されるかを数えた作業中の順序付けられていないマップに配置するように、ここで私が問題を抱えています私のコードの一部です:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <unordered_map> 


    std::cout << s << std::endl; //reads out one long string of DNA sequence 
    std::string kmer = ""; 



//split up large string into k sized substrings 
     for(int i = 0; i< s.length() ; ++i){ 
     int z= 0; 
     kmer = s.substr(z,k); 
     ++z; 

     if (kmer.length() != k){ 
        return 0; 
       } 





} 
     std::cout << kmer << std::endl; 
//unordered map to place unique values in and count if the same value shows  up 
      std::unordered_map<std::string, int > dna; 

      for (std::unordered_map<std::string,int>::iterator it=dna.begin(); it!=dna.end(); ++it){ 


      std::cout << it->first << " " << it->second << std::endl; 
     } 



    f.close(); 
    return 0; 
} 

答えて

0

あなたはそれが実際に動作させるためにマップに文字列を追加する必要があります。

dna[kmer]++;

また、変数zループ内で宣言されているので、毎回substr(z, k)を実行すると0になります。すべてのコードはすべて、正直言って非常に奇妙です。あなたは完全なものを投稿し、それを適切にフォーマットできますか?

私はこのような何かしようとするだろう:

// map where we store all kmers and number of occurences 
std::unordered_map<std::string, int > dna; 

// the following loop should run for every string in the file 
// i'm leaving that out for simplicity 
for (int i = 0; i < s.length(); ++i) { 
    std::string kmer = s.substr(i,k); 
    if (kmer.length() != k){ 
     break; 
    } 
    dna[kmer]++; 
} 

// finally, this prints the results 
for (std::unordered_map<std::string,int>::iterator it=dna.begin(); it!=dna.end(); ++it){ 
     std::cout << it->first << " " << it->second << std::endl; 
} 
+0

をありがとうございました!完璧に働いています。私はちょうど最後にすばやい質問をしました...テキストファイルに来たら無視したいという手紙があれば、どうすればいいですか?私がACTGで途中で取りたいと思っていないdnaシーケンスの文字Nを見つけた場合、nを無視して独自の値をどのようにカウントすればよいのでしょうか? – goldenunicorn

+0

文字列から完全に削除するのが、 'erase'iと思うと良いでしょう。 – PeterK

+0

どうすればその行を実装できますか?私は(dna.find( "N")){dna.erase( "N");しかし、私はエラーが発生します。 – goldenunicorn

関連する問題