2014-02-11 69 views
-1

让我有一种肽,这是一串字母,对应于氨基酸 说肽是html插入串在几个位置在同一时间

peptide_sequence = "VEILANDQGNR" 

而且它有升的修改处位置的位置和ř

我想插入"<span class=\"modified_aa\"></span>同时在那些职位之前和之后。

这里是我的尝试:

我的修改被存储在数组中的对象的pep_mods修饰包含与位置的属性的位置,在这种情况下4和11

pep_mods.each do |m| 
    peptide_sequence.gsub(peptide_sequence[m.position.to_i-1], "<span class=\"mod\">#{@peptide_sequence[m.location.to_i-1]}</span>") 
end 

但由于有第一次插入html span标签之后的两个修改字符串中的位置变得完全不同

我怎么能实现我打算做的事情?我希望它很清楚

+0

是的,这是一个错字 –

回答

1

弗洛里斯的回答是正确的,但如果你想这样做的困难的方式(O(n^2)而不是O(nlgn))这里是基本的想法。

而不是依靠gsub你可以遍历字符检查是否每个都有一个索引对应的修改之一。如果索引匹配,请执行修改。否则,请保留原始字符。

modified = peptide_sequence.each_with_index 
          .to_a 
          .map do |c, i| 
           pep_mods.each do |m| 
           if m.location.to_i = i 
            %Q{<span class="mod">#{c}</span>} 
           else 
            c 
           end 
           end 
          end.join('') 
3

你应该向后工作 - 从最后一个开始修改。这样,早期修改的索引不变。

您可能需要按相反顺序对索引数组进行排序 - 然后您可以使用您当前拥有的代码。

+1

哎,这听起来很聪明,我会给一个尝试 –

+0

这是一个相当常见的伎俩 - 在一般使用时,你是循环通过一系列对象,并随着您的行为进行修改。当你改变他们正在迭代的东西时,迭代器会感到困惑 - 但是当你向后工作时从来没有......从数组中删除元素是一个典型的例子,但它对于插入同样适用。 – Floris

+0

但它并不那么容易,因为字符串中的位置和字母可能是可变的,甚至是相邻的,这就是为什么我通过存储的字母和位置循环对象。 –

0

好,以防万一,这是其他任何人的帮助,这是怎么了,我终于做到了:

我先转换肽序列的数组:

pep_seq_arr = peptide_sequence.split("") 

然后使用each_with_index如凯西提到

pep_seq_arr.each_with_index do |aa, i| 
    pep_mods.each do |m| 
    pep_seq_arr[i] = "<span class='mod'>#{aa}</span>" if i == m.location.to_i-1 
    end 
end 

最后加入数组:

pep_seq_arr.join 

这比我首先想到的更容易

相关问题