Java初学者。 我正在研究一种搜索人类DNA部分的程序。 具体来说,我想使用StringBuilder.indexOf()在StingBuilder中找到所有出现的String。但我需要所有出现,而不仅仅是第一次出现。
代码:
public void search(String motive){
int count = 0;
gene.indexOf(motive); // gene is the Stringbuilder
count++;
}
我需要基因StringBuilder中所有动机的出现以及计数器基因中动机的频率。 任何帮助,因为indexOf()只显示第一次出现?
答案 0 :(得分:0)
我认为你正在寻找基因序列或亚序列中特定核苷酸序列的索引。以下示例类演示了使用Java的正则表达式库来查找这样的通用方法:
package jcc.tj.dnamatch;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Gene {
private String gene;
public Gene() {}
public Gene( String gene ) {
this.gene = gene;
}
public List<Integer> find( String seq ) {
List<Integer> indices = new ArrayList<Integer>();
Pattern pat = Pattern.compile( seq );
Matcher m = pat.matcher( gene );
while ( m.find() )
indices.add( m.start() );
return indices;
}
public String getGene() {
return gene;
}
public void setGene( String gene ) {
this.gene = gene;
}
}
上面的例子,使用Matcher查找模式。还有其他基于字符串的算法可能更有效,但作为起点,Matcher为任何类型的文本模式搜索提供了通用的解决方案。
将核苷酸编码为字符(ATCG)非常灵活和方便,允许使用基于String的工具来分析和表征序列和/或子序列。不幸的是,它们不能很好地扩展。在这种情况下,最好考虑更具体的生物信息学技术来表示和管理序列。
关于某些技术的一个很好的参考,将是第2章 - 书的下一代测序中的算法和数据结构Next Generation Sequencing Technologies and Challenges in Sequence Assembly。可以从this Google链接获得更详细的PDF预览。虽然我不能保证它永远有效。
您可能还想查看BioJava。虽然,我不想让你偏离Java,但Perl是序列分析的另一个好选择。 Beginning Perl for Bioinformatics; Perl and Bioinformatics;或BioPerl。
我意识到这个答案可能是TMI;但是,如果它能帮助您或其他人找到更合适的解决方案,那么它就达到了目的。
修改强>
根据下面的评论,这似乎是一个家庭作业问题,鉴于此
要求由StringBuilder.indexOf()
完成搜索。以下方法将相应地完成搜索。
public List<Integer> findBySb( String seq ) {
List<Integer> indices = new ArrayList<Integer>();
StringBuilder sb = new StringBuilder( gene );
int strIdx = 0;
while ( strIdx < sb.length() ) {
int idx = sb.indexOf( seq, strIdx );
if ( idx == -1 )
break;
indices.add( idx );
strIdx = idx + seq.length();
}
return indices;
}
相同的indexOf()
方法可以直接与字符串一起使用。
public List<Integer> findByString( String seq ) {
List<Integer> indices = new ArrayList<Integer>();
int strIdx = 0;
while ( strIdx < gene.length() ) {
int idx = gene.indexOf( seq, strIdx );
if ( idx == -1 )
break;
indices.add( idx );
strIdx = idx + seq.length();
}
return indices;
}
StringBuilder
和String
都使用String.indexOf()
的相同静态实现,因此在功能上没有区别。然而,
仅仅为了搜索而实例化StringBuilder
是过度的,有点过分
更浪费,因为它还分配缓冲区来管理字符串操作。我可以继续:),但它没有增加答案。