2016-05-04 2 views
0

Я написал код, который находит четыре разных последовательности символов.Поиск последовательностей символов, в зависимости от того, что на первом

ATG всегда в начале и TAG, TGA или TAA являются последовательностями «остановки».

Количество символов между пуска и останова должны на кратное 3.

Например, в следующей строке: ACC ATG CCC TAG ТТТ моя программа возвращает ATG CCC TAG.

И в этой строке: AA ATG CC TAG T ТАА программа возвращает ATG CCTAGT ТАА, так как количество символов между ATG и ТГА не кратно трем, так это ищет следующую последовательность «stop», которая в этом случае является TAA.

Вот код:

public class TagFinder { 
    public String findProtein(String dna) { 
     String fpL = dna.toLowerCase(); 
     int start = fpL.indexOf("atg"); 
     int stop = fpL.indexOf("tag", start+3); 
     int stop2 = fpL.indexOf("tga", start+3); 
     int stop3 = fpL.indexOf("taa", start+3); 
     if (start == -1) { 
      return ""; 
     } 

     if ((stop - start) % 3 == 0) { 
      return fpL.substring(start, stop+3); 
     } 

     if ((stop2 - start) % 3 == 0) { 
      return fpL.substring(start, stop2+3); 
     } 

     if ((stop3 - start) % 3 == 0) { 
      return fpL.substring(start, stop3+3); 
     } 
     else { 
      return ""; 
     } 
    } 

Однако, в следующей строке "ATT ATG CCC ТАА TAG", код будет первым найти ATG CCCTAA TAG, даже если ТАА первая «стоп-последовательность» в строке и количество символов между ATG и TAA равно 3.

Как написать эту программу, чтобы какая-то последовательность «STOP» появилась первой в строке и n3 от начальной последовательности.

спасибо.

ответ

0

Регулярные выражения будут делать.

String input = "ACCATGCCCTAGTTT"; 
    String expected = "ATGCCCTAG"; 

    Pattern pattern = Pattern.compile("(ATG)(.{3})*?(TAG|TGA|TAA)", 
      Pattern.CASE_INSENSITIVE); 
    Matcher m = pattern.matcher(input); 
    while (m.find()) { 
     System.out.printf("[%d] %s%n", m.start(), m.group()); 
    } 

В приведенном выше стартовой позиции не обязательно кратен 3. Если начальное положение должно быть кратно 3, то было бы проще сделать группы из 3 букв и сепаратора.

input = input.replaceAll(".{3}", "$0,"); 

    Pattern pattern = Pattern.compile("(ATG,)(.{4})*?(TAG|TGA|TAA),", 
      Pattern.CASE_INSENSITIVE); 
    Matcher m = pattern.matcher(input); 
    while (m.find()) { 
     System.out.printf("[%d] %s%n", m.start() * 3/4, m.group().replace(",", "")); 
    } 
0

От

if ((stop - start) % 3 == 0) { return fpL.substring(start, stop+3); }

Это первый находит TAG и оператор возврата называется. Если вы действительно хотите найти первую точку остановки, добавьте некоторую логику comaprison между stop, stop2 и stop3, чтобы найти, который является наименьшим индексом. Затем выполните проверку % 3 для каждого и вернитесь из первого, который является ОК, или всей строки, если нет действительного случая. Также как насчет использования регулярного выражения для этой проблемы? Что-то в строках (ATG)\w{3}(TAG|TGA|TAA).

0

Вы должны определить минимум все теги стоп, так что я бы написать что-то вроде этого:

[...] 
    int minStop = MAXINT; 

    if ((stop - start) % 3 == 0 && minStop > stop) { 
     minStop = stop; 
    } 

    if ((stop2 - start) % 3 == 0 && minStop > stop2) { 
     minStop = stop2; 
    } 

    if ((stop3 - start) % 3 == 0 && minStop > stop3) { 
     minStop = stop3; 
    } 

    if (minStop < MAXINT) { 
     return fpL.substring(start, minStop+3); 
    } else { 
     [...] 
    } 
0

Следующий код использует список всех поисковых слов, а затем выбирает минимальное соответствие индекса.

public String findProtein(String dna) { 
    String fpL = dna.toLowerCase(); 
    int start = fpL.indexOf("atg"); 

    List<String> searchWords = new ArrayList<>(); 
    searchWords.add("tag"); 
    searchWords.add("tga"); 
    searchWords.add("taa"); 

    int start = fpL.indexOf("atg"); 
    try{ 
     int startIndex = searchWords.stream().mapToInt(word -> fpL.indexOf(word, 3 + start)).filter(idx -> idx >= 0 && 0 == idx % 3) 
       .min().getAsInt(); 

     return dna.substring(start, startIndex + 3); 

    } catch(NoSuchElementException ex) { 
     return ""; 
    } 
} 
0

Причина код находит «TAG» первым потому, что, как вы написали код: Ваш первый if заявление проверяет «TAG». Если он находит один, он возвращает строку между «ATG» и «TAG» и завершает работу.

Что вам нужно сделать, это создать переменную min и сохранить значение найденного кодона терминатора в этом min (после проверки действительно минимально). НЕ использовать return в операциях if, которые ищут кодоны терминатора. и возвращает min + 3 только после выполнения трех заявлений if и определения реального минимального расстояния от «TAG».

Надеюсь, это было полезно.

Смежные вопросы