查找字符序列,以先到者为准

时间:2016-05-04 11:07:26

标签: java string

我写了一个代码,找到了四种不同的字符序列。

ATG始终处于起步阶段,TAG,TGA或TAA是"停止"序列。

START和STOP序列之间的字符数应为3的倍数。

例如,在以下字符串中:ACC ATG CCC TAG TTT我的程序返回 ATG CCC TAG

在此字符串中:AA ATG CC TAG T TAA 程序返回 ATG CCTAGT TAA ,因为ATG和TGA之间的字符数不是三的倍数,所以它寻找下一个"停止"序列,在这种情况下是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 TAA TAG"中,代码首先会找到 ATG CCCTAA TAG ,即使TAA是第一个"停止"字符串中的序列和ATG与TAA之间的字符数为3.

我怎样才能编写这个程序,以便在#34; STOP"序列首先出现在字符串中,并且返回起始序列的n3。

谢谢。

5 个答案:

答案 0 :(得分:0)

来自

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

首先找到TAG并调用return语句。如果您确实想要找到第一个停止点,请在stopstop2stop3之间添加一些comaprison逻辑,以找出哪个是最小的索引。然后对每个进行% 3检查并从第一个确定返回,或者如果没有有效的情况则返回整个字符串。还有如何使用正则表达式来解决这个问题? (ATG)\w{3}(TAG|TGA|TAA)

中的某些内容

答案 1 :(得分: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 {
      [...]
    }

答案 2 :(得分: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 "";
    }
}

答案 3 :(得分: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(",", ""));
    }

答案 4 :(得分:0)

代码找到&#34; TAG&#34;首先是因为你编写代码的方式: 您的第一个if语句会检查&#34; TAG&#34;。如果找到一个,则返回&#34; ATG&#34;之间的字符串。和&#34; TAG&#34;并终止。

您需要做的是创建一个min变量并将找到的终止密码子的值存储在此min中(在检查它之后真的是最小值)。不要在搜索终止密码子的return语句中使用if。并且仅在执行了三个min + 3语句后返回if并确定了与#34; TAG&#34;的实际最小距离。

希望它有用。