2010-03-06 5 views
4

C'est quand j'essaie de faire des choses comme ça que je me rends compte que j'ai vraiment besoin d'aller à l'université!(Java) Trouver toutes les paires possibles dans un tableau

Quoi qu'il en soit, j'ai un tableau de chaînes (275) dont j'ai besoin de les boucler et de créer des chaînes de toutes les paires possibles, en java.

J'ai appris la récursivité mais je ne trouve pas la réponse à cette question.

Merci

+1

Pourquoi la récursion? Un double pour-déclaration ferait l'affaire. –

+0

Étant donné un tableau '[a, b, c]', voulez-vous créer: '[ab, ac, ba, bc, ca, cb]'? Ou sont «ab» et «ba» la même chose? –

+0

ab et ba sont les mêmes – user169743

Répondre

9

En paires de cas ab et ba sont dif férentes, faire:

for i=0 to array.length 
    for j=0 to array.length 
    if i == j skip 
    else construct pair array[i], array[j] 

et sinon, faire quelque chose comme ceci:

for i=0 to array.length-1 
    for j=i+1 to array.length 
    construct pair array[i], array[j] 

Notez que je suppose le tableau contient des chaînes uniques!

+3

Salut. J'ai besoin exactement de la même chose .. Mais j'ai un grand tableau (disons avec une taille de 10^9) .. Il faut beaucoup de temps pour répondre .. y at-il un moyen optimisé? – Jeevi

+0

Seule optimisation possible je verrais ici (premier cas) est de supprimer le test if, et après les boucles, supprimer les n objets supplémentaires où 'i == j' (Si vous pouvez le faire avec la structure de données que vous avez sélectionné) . De cette façon, vous n'avez pas besoin d'effectuer 'n^2' fois la vérification de i == j. Mais alors, peut-être que la JVM optimise déjà cette façon de faire. Ensuite, si vous pouvez vous permettre de faire du multithreading ou du cloud computing, vous pouvez toujours diviser les boucles entre plusieurs threads/serveurs –

1

C'est une double boucle simple:

for(int x = 0; x < 275; x++) { 
    final String first = arrayOfStrings[x]; 
    for(int y = 0; y < 275; y++) { 
     if(y == x) continue; // will properly increase y 
     final String second = arrayOfStrings[y]; 
     // TODO: do stuff with first and second. 
    } 
} 

Edit: les commentaires ont noté, si les éléments [a, b, c] ont un seul ab et donc pas ba, (appelé combinaison), le code suivant fonctionnera:

final ArrayList<String> collected = new ArrayList<String>(); 
for(int x = 0; x < 275; x++) { 
    for(int y = 0; y < 275; y++) { 
     if(y == x) continue; // will properly increase y 
     final String p1 = arrayOfStrings[x] + arrayOfStrings[y]; 
     final String p2 = arrayOfStrings[y] + arrayOfStrings[x]; 
     if(!collected.contains(p1) && !collected.contains(p2)) { 
      collected.add(p1); 
     } 
    } 
} 
// TODO: do stuff with collected 
2

Je fournis un exemple qui imprime toutes les chaînes de n-tuples possibles, il suffit de définir l'attribut reqLen à 2 et il imprime toutes les paires possibles.

public class MyString { 

String[] chars = {"a", "b", "c"}; 
int reqLen = 2; 

private void formStrings(String crtStr){ 

    if (crtStr.length() == reqLen){ 

     System.out.println(crtStr); 
     return; 
    } 
    else 
     for (int i = 0; i < chars.length; i++) 
      formStrings(crtStr + chars[i]); 

} 

public static void main(String[] args) { 

    new MyString().formStrings(""); 
}} 
Questions connexes