여기 자바 초보자. 저는 현재 인간 DNA의 일부를 검색하는 프로그램을 작업 중입니다. 특히 StringBuilder.indexOf ()를 사용하여 StingBuilder 내에서 String의 모든 발생을 찾고 싶습니다. 그러나 나는 첫 번째뿐만 아니라 모든 발생이 필요합니다.
암호:
public void search(String motive){
int count = 0;
gene.indexOf(motive); // gene is the Stringbuilder
count++;
}
나는 StringBuilder 유전자의 모든 동기와 유전자에 동기가 얼마나 자주 있는지 카운터가 필요합니다. indexOf ()가 첫 번째 항목 만 표시하므로 도움이 필요하십니까?
나는 당신이 유전자 서열 또는 하위 서열 내에서 특정 뉴클레오티드 서열의 인덱스를 찾고 있다고 생각합니다. 다음 예제 클래스는이를 찾기 위해 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)로 인코딩하는 것은 매우 유연하고 편리하므로 문자열 기반 도구를 사용하여 시퀀스 및 / 또는 하위 시퀀스를 분석하고 특성화 할 수 있습니다. 불행히도 그들은 잘 확장되지 않습니다. 이러한 경우 서열을 표현하고 관리하기 위해보다 구체적인 생물 정보학 기술을 고려하는 것이 좋습니다.
특정 기술에 대한 좋은 참고 자료는 Next Generation Sequencing Technologies and Challenges in Sequence Assembly 책의 Chapter 2 – Algorithms and Data Structures in Next-Generation Sequencing을 참조하십시오 . 더 자세한 PDF 미리보기는 이 Google 링크 에서 볼 수 있습니다 . 영원히 작동한다고 보장하지는 않겠지 만.
BioJava 를 살펴볼 수도 있습니다 . Java에서 당신을 훼손하고 싶지는 않지만 Perl은 시퀀스 분석을위한 또 다른 좋은 대안입니다. Bioinformatics를위한 Perl 시작 ; Perl 및 생물 정보학 ; 또는 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
검색을 위해 인스턴스화하는 것은 과도하고 문자열 작업을 관리하기 위해 버퍼를 할당하기 때문에 조금 더 낭비입니다. 나는 계속할 수 있지만 대답에 추가되지는 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다