多个for循环迭代器的最佳实践

时间:2015-04-05 01:54:22

标签: java arrays for-loop

我正在尝试更改和反转数组。因此,我希望循环使用负迭代器(访问初始数组值)和正迭代器(写入新数组)。这是我此时的代码。 (对于那些了解某些生物学的人来说,这段代码会写出DNA串的反向补码。)

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迭代器,我只是不知道放在哪里。这是处理这种情况的最佳方式(需要两个迭代器),或者如果我做得有点不同会更好吗?

1 个答案:

答案 0 :(得分: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]

revComp

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

当我用

检查时
System.out.println("revComp: " + Arrays.toString(revComp));
System.out.println("DNA: " + Arrays.toString(DNA));