J'ai écrit une méthode pour prendre deux tableaux triés et retourner un tableau de toutes les valeurs communes, en ignorant les doublons. Il y a beaucoup de répétitions. Je ne sais pas si c'est juste la nature de la question ou si mon code a besoin de beaucoup d'améliorations. Voici mon code:Trouver l'intersection de deux tableaux triés - comment simplifier mon code
static ArrayList<Integer> findCommon(int[] a, int[] b) {
ArrayList<Integer> res = new ArrayList<Integer>();
int ai = 0, bi = 0;
int sizeA = a.length, sizeB = b.length;
while(ai < sizeA && bi < sizeB) {
// Ignore duplicates
if(ai != 0 && a[ai] == a[ai-1]) {
ai++;
continue;
}
if(bi != 0 && b[bi] == b[bi-1]) {
bi++;
continue;
}
if(a[ai] < b[bi]) {
ai++;
} else if(a[ai] > b[bi]) {
bi++;
} else if(a[ai] == b[bi]) {
res.add(a[ai]);
ai++;
bi++;
}
}
// Need to keep going in case the last element of one array is contained
// in the other at a later point
while(ai < sizeA) {
// Ignore duplicates
if(ai != 0 && a[ai-1] == a[ai]) {
ai++;
continue;
}
if(b[bi-1] < a[ai]) {
break;
} else if(b[bi-1] > a[ai]) {
ai++;
} else if(b[bi-1] == a[ai]) {
res.add(a[ai]);
ai++;
}
}
while(bi < sizeB) {
// Ignore duplicates
if(bi != 0 && b[bi-1] == b[bi]) {
bi++;
continue;
}
if(a[ai-1] < b[bi]) {
break;
} else if(a[ai-1] > b[bi]) {
bi++;
} else if(a[ai-1] == b[bi]) {
res.add(b[bi]);
bi++;
}
}
return res;
}
Conservez 'a [ai]' et 'b [bi]' dans les variables locales, initialisez avec 'a [0]' et 'b [0]' et mettez à jour au fur et à mesure. (Indice: [Cas de coin] (http://stackoverflow.com/questions/1036666/what-is-the-usage-of-array-of-zero-length)?) Alors vous devriez pouvoir perdre les deux derniers 'while' boucles. – krlmlr