2017-01-06 2 views
0

Java Новичок здесь. В настоящее время я работаю над программой, которая ищет часть ДНК человека. В частности, я хочу найти все вхождения String внутри StingBuilder, используя StringBuilder.indexOf(). Но мне нужны все вхождения, а не только первые.Получение всех позиций происходящей строки с помощью StringBuilder.indexOf()

Код:

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


} 

мне нужно все вхождения мотива в гене StringBuilder плюс счетчика, как часто мотив в гене. Любая помощь, поскольку indexOf() отображает только первое появление?

+0

Существуют ли другие 'indexOf' методы в' StringBuilder'? –

+0

ну да, есть '' indexOf (String str, int fromIndex) ', но это тоже не очень полезно, так как я еще не знаю, где появляется «str» (очевидно). – Smunfr

+0

[Получение временной отметки unix из Date()] (// stackoverflow.com/q/7784421) –

ответ

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

В приведенном выше примере, используйте Искатель для поиска шаблонов. Существуют другие алгоритмы на основе String, которые могут быть более эффективными, но в качестве отправной точки Matcher предлагает универсальное решение для любого типа поиска в текстовом шаблоне.

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

Хорошая ссылка на некоторые методы, будет главой 2 - Алгоритмы и структуры данных в следующем поколении последовательности Next Generation Sequencing Technologies and Challenges in Sequence Assembly. Более подробный просмотр в формате PDF доступен по ссылке this Google; хотя я не буду гарантировать, что он будет работать вечно.

Вы также можете посмотреть BioJava. Хотя, я бы не хотел отвлекать вас от Java, Perl - еще одна хорошая альтернатива для анализа последовательности. Beginning Perl for Bioinformatics; Perl and Bioinformatics; или BioPerl.

Я понимаю, что этот ответ может быть TMI; но, если это поможет вам или другим найти более подходящие решения, это послужило своей цели.

Edit:

Основываясь на комментарий ниже, это, кажется, домашнее задание вопрос, учитывая требование о том, что поиск будет осуществляться по 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 только для поиска, является излишним и немного более расточительным, так как он также выделяет буферы для управления строковыми операциями. Я мог бы продолжить :), но это не добавляет ответа.

+0

Большое вам спасибо, это поможет многому продолжить работу с моим проектом (так как мне нужен этот метод в дальнейших задачах). Проблема только в том, что моей задачей было специально использовать метод indexOf() для StringBuilder. Если я не смогу понять это, решение ура будет служить цели в любом случае. – Smunfr

+0

@Smunfr См. Дополнительный метод, добавленный в решение выше для поиска на основе StringBuilder. – Frelling