使用StringBuilder.indexOf()获取发生的String的所有位置

时间:2017-01-06 16:13:26

标签: java stringbuilder indexof

Java初学者。 我正在研究一种搜索人类DNA部分的程序。 具体来说,我想使用StringBuilder.indexOf()在StingBuilder中找到所有出现的String。但我需要所有出现,而不仅仅是第一次出现。

代码:

public void search(String motive){
    int count = 0;
    gene.indexOf(motive);   // gene is the Stringbuilder
    count++;


}

我需要基因StringBuilder中所有动机的出现以及计数器基因中动机的频率。 任何帮助,因为indexOf()只显示第一次出现?

1 个答案:

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

StringBuilderString都使用String.indexOf()的相同静态实现,因此在功能上没有区别。然而, 仅仅为了搜索而实例化StringBuilder是过度的,有点过分 更浪费,因为它还分配缓冲区来管理字符串操作。我可以继续:),但它没有增加答案。