Почему BlueJ пытается выполнить мою программу навсегда - PullRequest
0 голосов
/ 16 мая 2019

Я не уверен, если это проблема с моим кодом или нет, но когда я пытаюсь запустить код со строкой длиной более 50 символов, BlueJ пытается запустить программу навсегда, и консоль никогда не появляется.Я оставил его работать в течение часа или около того до сих пор безрезультатно.

Я пытался ввести множество строк непосредственно в программу, и кажется, что более короткие нити ДНК, введенные в систему, работают нормально, но после определенной длины программа никогда не выполняется, и я не уверен, в чем проблемапотому что не отображаются сообщения об ошибках или исключения.

package com.company;

public class problem3 {

    public static void main(String[] args) {
        new problem3().printAllGenes("CAATGCTGATAGTAATGGTATTATGATATGTAGTGGGATTTAGAGGATGCGCGCAGCCGATGACGAGCGACGATGCTAA");
    }

    public int findStopCodon(String dnaStr, int startIndex, String stopCodon) {
        int currIndex = dnaStr.indexOf(stopCodon, startIndex + 3);
        while (currIndex != -1) {
            int diff = currIndex - startIndex;
            if (diff % 3 == 0) {
                return currIndex;
            } else {
                currIndex = dnaStr.indexOf(stopCodon, currIndex+1);
            }
        }
        return dnaStr.length();
    }

    public String findGene(String dna, int where) {
        int startIndex = dna.indexOf("ATG", where);

        if (startIndex == -1) {
            return "";

        }
        int taaIndex = findStopCodon(dna, startIndex, "TAA");
        int tagIndex = findStopCodon(dna, startIndex, "TAG");
        int tgaIndex = findStopCodon(dna, startIndex, "TGA");
        int minIndex = 0;

        if (taaIndex == -1 || (tgaIndex != -1 && tgaIndex < taaIndex)) {
            minIndex = tgaIndex;

        } else {
            minIndex = taaIndex;
        }
        if (minIndex == -1 || (tagIndex != -1 && tagIndex < minIndex)) {
            minIndex = tagIndex;
        }
        if (minIndex == -1) {

            return "";
        }
        if (minIndex + 3 > dna.length()) {
            return "";
        }

        return dna.substring(startIndex, minIndex + 3);
    }

    public void printAllGenes(String dna) {

        int startIndex = 0;

        while (true) {

            System.out.println("yes");
            String currentGene = findGene(dna, startIndex);

            if (currentGene.isEmpty()) {
                break;
            }

            System.out.println(currentGene);

            startIndex = dna.indexOf(currentGene, startIndex) + currentGene.length();
        }

    }
}

Предполагается, что программа берет нить ДНК и выводит гены, находя стартовые кодоны (ATG) и стоп-кодоны (TAA, TAG, TGA).Чтобы запустить программу, я бы вызвал метод printAllGenes () с String dna = "CAATGCTGATAGTAATGGTATTATGATATGTAGTGGGATTTAGAGGATGCGCGCAGCCGATGACGAGCGACGATGCTAA".

1 Ответ

0 голосов
/ 16 мая 2019

Возможно, вам придется изменить

currIndex = dnaStr.indexOf(stopCodon, currIndex);

в findStopCodon до

currIndex = dnaStr.indexOf(stopCodon, currIndex + 1);

Потому что в противном случае вы всегда найдете один и тот же currIndex и никогда не выйдете из цикла while.

...