2016-09-25 7 views
1

Я разделил текстовый файл на строку на основе целого числа k, и я хочу подсчитать, сколько раз появляется одна и та же строка. В этот момент у меня есть строка, разбитая на отдельные подстроки, но я не могу заставить неупорядоченную карту читать каждую строку и подсчитывать уникальные подстроки.Как разбить и подсчитать уникальные значения подстроки с помощью хеш-таблицы (неупорядоченная карта)?

Пробу текстовый файл выглядит как этот

3 3 
ACTG 
ACTG 
ACTG 

Если первый # 3, как долго каждая подстрока и второй 3 позволяет мне проверить, если есть, что многие строки в файле.

строка будет разделена на подстроки, которые выглядят так:

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

Я пытаюсь подсчитать, сколько раз такое же значение показывает, но не могу показаться, чтобы сделать это правильно.

Моей единственной проблемой является получение файла для правильного разбиения подстрок, чтобы он действительно читал эти строки, а затем помещал их в рабочую неупорядоченную карту, которая подсчитывает, сколько раз появляется уникальное значение. Вот часть моего кода, что я испытывающим трудности с:

#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]++;

Кроме того, переменная г будет 0, когда вы делаете substr(z, k) каждый раз, так как он объявлен внутри цикла. В целом код довольно странный, если быть честным. Можете ли вы опубликовать полную информацию и правильно ее отформатировать?

Я хотел бы попробовать что-то вроде этого:

// 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

Спасибо так много! отлично работает, у меня просто был последний последний вопрос ... Если у меня есть письмо, которое я хотел бы игнорировать, если бы он появился в текстовом файле ... как бы я это сделал? Как и в случае, если я найду букву N в моей последовательности dna, я не хочу мешать с ACTG, как бы я игнорировать n и все еще считать уникальные значения? – goldenunicorn

+0

Лучшим способом было бы удалить его из строк полностью с помощью 'erase'i think. – PeterK

+0

как бы реализовать эту линию? я попытался, если (dna.find ("N")) {dna.erase ("N"); но я получаю сообщение об ошибке. – goldenunicorn