2015-04-05 2 views
0

Я пытаюсь изменить массив массивов. Таким образом, я хочу, чтобы цикл с отрицательным итератором (для доступа к начальным значениям массива) и положительным итератором (для записи в новый массив). Вот код, который у меня есть на данный момент. (Для тех, кто знает, какую биологию, этот код пишет обратный комплемент строки ДНК.)Лучшая практика с несколькими итераторами цикла

final char[] DNA = {'G','A','T','T','A','C','A'}; 
char[] revComp = new char[DNA.length]; 

int j = 0; 
for (int i = DNA.length - 1; i >= 0; i--) { 
    switch (DNA[i]) { 
     case 'A': DNA[i] = 'T'; break; 
     case 'T': DNA[i] = 'A'; break; 
     case 'C': DNA[i] = 'G'; break; 
     case 'G': DNA[i] = 'C'; break; 
    } 
    revComp[j] = DNA[i]; 
    j++; 
} 

Как вы можете заметить, у меня есть нормальный я итератор и дополнительный J итератор, который я просто не сделал знать, куда положить. Это лучший способ приблизиться к такой ситуации (где нужны два итератора), или было бы лучше, если бы я сделал это по-другому?

+3

Я думаю, вы должны больше беспокоиться о людях, которые не знают биологию и объяснить, что он делает и почему можно было бы необходимо два итератора, чтобы сделать это. – ChiefTwoPencils

+0

Вы можете написать '' revComp [DNA.length - 1 - i] = DNA [i]; '. Таким образом вам не нужно '' j''. – Aero

+1

По-видимому, не нужно двух итераторов! Однако для тех, кому интересно, дополнительную информацию об этой проблеме можно найти здесь: http://rosalind.info/problems/revc/ Чтобы узнать больше об этой проблеме, нажмите «нажмите, чтобы развернуть». – randomraccoon

ответ

2

Вы могли бы устранить свой "второй" итератор (я имею в виду счетчик цикла), как

for (int i = 0; i < DNA.length; i++) { 
    switch (DNA[i]) { 
    case 'A': 
     DNA[i] = 'T'; 
     break; 
    case 'T': 
     DNA[i] = 'A'; 
     break; 
    case 'C': 
     DNA[i] = 'G'; 
     break; 
    case 'G': 
     DNA[i] = 'C'; 
     break; 
    } 
    revComp[i] = DNA[DNA.length - i - 1]; 
} 

Или как

for (int i = DNA.length - 1; i >= 0; i--) { 
    switch (DNA[i]) { 
    case 'A': 
     DNA[i] = 'T'; 
     break; 
    case 'T': 
     DNA[i] = 'A'; 
     break; 
    case 'C': 
     DNA[i] = 'G'; 
     break; 
    case 'G': 
     DNA[i] = 'C'; 
     break; 
    } 
    revComp[DNA.length - i - 1] = DNA[i]; 
} 

которые оба производят DNA из

[C, T, A, A, T, G, T] 

и a revComp

[T, G, T, A, A, T, C] 

, когда я проверил с

System.out.println("revComp: " + Arrays.toString(revComp)); 
System.out.println("DNA: " + Arrays.toString(DNA)); 
+0

А, это легко. Благодаря! – randomraccoon

+0

Не первый ли не гарантирует, что элемент, который вы копируете, уже был изменен? Потому что вы меняете ДНК [i] и копируете ДНК [DNA.length - i - 1]. –

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