2013-02-24 4 views
0

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; 
    } 
+0

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

Répondre

1

ArrayList a une méthode Contient(). Alors, qu'en est-il? En faisant la boucle for sur le tableau le plus long, vous vous assurez que toutes les entrées sont vérifiées. Le intersect.Contains(a[i]) signifie qu'il va ignorer les doublons.

Questions connexes