Мне нужно заменить символы в массиве, используя только цикл.Я не могу сделать ничего более продвинутого, чем это.Что я должен делать? - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над анализатором цепей искусственной ДНК, и мне нужно создать цепочку комплемента для этого:

char [] testStrand = {'A', 'T', 'T', 'A', 'G', 'C', 'T', 'A', 'T', 'G', 'A', 'A', 'C', 'C', 'T', 'A', 'C', 'C', 'A', 'T'};

Примечание. Это 20 символов, если это поможет.

Я не могу жестко закодировать это, и мне нужно использовать цикл для итерации каждого символа и выяснить, как поменять местами буквы А с буквами Т (и наоборот) и буквы G с буквами С (и наоборот.)

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Поскольку кто-то уже предложил подход else / if, здесь то же самое, но вместо этого используются троичные операторы:

char[] testStrand = {'A', 'T', 'T', 'A', 'G', 'C', 'T', 'A', 'T', 'G', 'A', 'A', 'C', 'C', 'T', 'A', 'C', 'C', 'A', 'T'};
for (int i = 0; i < testStrand.length; i++) {
    testStrand[i] = testStrand[i] == 'A' ? 'T' :
        testStrand[i] == 'T' ? 'A' :
            testStrand[i] == 'G' ? 'C' :
                testStrand[i] == 'C' ? 'G' : testStrand[i];
}

Обновление

Я заметил, что вы спросили, как вставить новые значения вдругой массив:

char[] testStrand = {'A', 'T', 'T', 'A', 'G', 'C', 'T', 'A', 'T', 'G', 'A', 'A', 'C', 'C', 'T', 'A', 'C', 'C', 'A', 'T'};
char[] reversed = new char[testStrand.length];

for (int i = 0; i < testStrand.length; i++) {
    if (testStrand[i] == 'A') {
        reversed[i] = 'T';
    } else if (testStrand[i] == 'T') {
        reversed[i] = 'A';
    } else if (testStrand[i] == 'C') {
        reversed[i] = 'G';
    } else if (testStrand[i] == 'G') {
        reversed[i] = 'C';
    } else {
        reversed[i] = testStrand[i];
    }
}

Обновление 2

Но, эй, если вы чувствуете себя диким:

Character[] testStrand = {'A', 'T', 'T', 'A', 'G', 'C', 'T', 'A', 'T', 'G', 'A', 'A', 'C', 'C', 'T', 'A', 'C', 'C', 'A', 'T'};
List<Character> chars = Arrays.asList(testStrand);
chars.replaceAll(c -> {
    switch (c) {
        case 'A': return 'T';
        case 'T': return 'A';
        case 'C': return 'G';
        case 'G': return 'C';
        default: return c;
    }
});

// print them out
chars.forEach(System.out::println);
0 голосов
/ 25 апреля 2018

код Jimmyv: Лучше?

char[] complementstrand = {'A', 'T', 'T', 'A', 'G', 'C', 'T', 'A', 'T', 'G', 'A', 'A', 'C', 'C', 'T', 'A', 'C', 'C', 'A', 'T'};
    for (int i = 0; i < complementstrand.length; i++) {

    if (Character.toString(complementstrand[i]).equals("A")){
complementstrand[i] = "T".charAt(0);
}

    else if (Character.toString(complementstrand[i]).equals("T")){
complementstrand[i] = "A".charAt(0);
}


    else if (Character.toString(complementstrand[i]).equals("G")){
complementstrand[i] = "C".charAt(0);
}


    else if (Character.toString(complementstrand[i]).equals("C")){
complementstrand[i] = "G".charAt(0);
}


}
System.out.println(Arrays.toString(complementstrand));
0 голосов
/ 25 апреля 2018

Самое простое решение:

char[] testStrand = {'A', 'T', 'T', 'A', 'G', 'C', 'T', 'A', 'T', 'G', 'A', 'A', 'C', 'C', 'T', 'A', 'C', 'C', 'A', 'T'};
char[] newTestStrand = new char[testStrand.length];
for (int i = 0, l = testStrand.length; i < l; i++)
{
   if (testStrand[i] == 'A')
   {
      newTestStrand[i] = 'T';
   }
   else if (testStrand[i] == 'T')
   {
      newTestStrand[i] = 'A';
   }
   else if (testStrand[i] == 'C')
   {
      newTestStrand[i] = 'G';
   }
   else if (testStrand[i] == 'G')
   {
      newTestStrand[i] = 'C';
   }
   else
   {
      newTestStrand[i] = testStrand[i];
   }
}

или с оператором switch (не уверен, разрешено ли вам это использовать):

char[] testStrand = {'A', 'T', 'T', 'A', 'G', 'C', 'T', 'A', 'T', 'G', 'A', 'A', 'C', 'C', 'T', 'A', 'C', 'C', 'A', 'T'};
char[] newTestStrand = new char[testStrand.length];
for (int i = 0, l = testStrand.length; i < l; i++)
{
   switch (testStrand[i])
   {
      case 'A':
        newTestStrand[i] = 'T';
        break;
      case 'T':
        newTestStrand[i] = 'A';
        break;
      case 'G':
        newTestStrand[i] = 'C';
        break;
      case 'C':
        newTestStrand[i] = 'G';
        break;
      default:
        newTestStrand[i] = testStrand[i];
        break;
    }
}

Но на самом деле я бы рекомендовал представлятьперестановки как-то (пары ключ-значение) и прохождение через потенциальные перестановки.Я придерживался простого решения, так как вы сказали «только петли»

...