Я полагаю, что вы ищете индексы определенной нуклеотидной последовательности в последовательности или подпоследовательности гена. В следующем примере класс демонстрирует общий подход, использующий библиотеку регулярных выражений в 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
только для поиска, является излишним и немного более расточительным, так как он также выделяет буферы для управления строковыми операциями. Я мог бы продолжить :), но это не добавляет ответа.
Существуют ли другие 'indexOf' методы в' StringBuilder'? –
ну да, есть '' indexOf (String str, int fromIndex) ', но это тоже не очень полезно, так как я еще не знаю, где появляется «str» (очевидно). – Smunfr
[Получение временной отметки unix из Date()] (// stackoverflow.com/q/7784421) –