0
votes

imprimer les éléments communs de deux tableaux int sans répétition [débutant]

J'apprécierais quelques conseils pour que je puisse me mettre sur la bonne voie. J'essaye d'imprimer les valeurs communes de deux tableaux int sans répétition. Je ne peux pas utiliser de chaînes, collections, tableaux supplémentaires ou manipuler des tableaux existants, et je ne peux utiliser que le package java.lang.

Voici mon code pour l'instant:

  int[] a = { 6, 0, 2, -7, 16, 9, 1, -8, 9, 9, 3, -9, -1, 0, 1, -8, 2, 99 };
  int[] b = { 16, 0, 5, 2, -5, 3, 3, 9, 9, 1, -8, -8};
  int al = a.length;
  int bl = b.length;


  for (int i = 0; i < al; i++) {

        for (int j = i+1; j < al ; j++) {

            // duplicates exist
            if (a[i] == a[j] ) {
            // not sure what to put here?
            }

        }
    }

ou

   int[] a = { 6, 0, 2, -7, 16, 9, 1, -8, 9, 9, 3, -9, -1, 0, 1, -8, 2, 99 };
   int[] b = { 16, 0, 5, 2, -5, 3, 3, 9, 9, 1, -8, -8};
   int al = a.length;
   int bl = b.length;

    for (int x = 0; x < al; x++) {

          for (int y = 0; y < bl; y++) {

            if ( a[x] == b[y] ) {

              System.out.print( a[x] + " ");
              break;
                                 }
          }
        }

-Ce qui s'imprime avec mon code actuel: 0 2 16 9 1-8 9 9 3 0 1-8 2
-Ce que je veux imprimer (la commande peut différer): 0 2 16 9 1-8 3

Une idée que j'ai eue était de vérifier le premier tableau pour les doublons en utilisant une autre boucle for et de continuer à la boucle principale (qui vérifie les éléments communs) s'il ne s'agit pas d'un doublon, mais je ne sais pas comment procéder ou si c'est même faisable. Toutes mes tentatives de mise en œuvre de cette idée échouent jusqu'à présent.

J'ai écrit un extrait de code avec la boucle for qui vérifie les doublons (mais je ne sais pas quoi en faire):

int[] a = { 6, 0, 2, -7, 16, 9, 1, -8, 9, 9, 3, -9, -1, 0, 1, -8, 2, 99 };
int[] b = { 16, 0, 5, 2, -5, 3, 3, 9, 9, 1, -8, -8 };


for (int x : a) {

    for (int y : b) {

        if(x == y) {
             System.out.print(x + " ");
             break;
                   }
    }
}

J'avais plusieurs idées sur la façon dont je pourrais résoudre ce problème mais les règles de tâche ont réussi à interdire toutes mes solutions possibles, aidez-moi s'il vous plaît


2 commentaires

Bien que les liens soient une excellente source d'informations supplémentaires , ils ne peuvent pas en être la seule source car ils peuvent être interrompus ou le contenu lié peut être modifié. Utilisez l'option d' édition et mettez la description de la tâche sous forme de texte (pas d'image) à la question elle-même.


@Pshemo merci pour le tuyau, je garderai cela à l'esprit


3 Réponses :


0
votes
  1. Itérer sur le premier tableau
    1. Vérifiez si l'élément actuel s'est produit précédemment dans le premier tableau
      1. Sinon: vérifiez si l'élément apparaît dans le deuxième tableau et si c'est le cas, imprimez-le.

Cela devrait éviter toute valeur en double dans la sortie.


0 commentaires

0
votes
  1. Itérer via un
  2. Nous devrions vérifier si ce numéro figurait auparavant dans un
  3. Si oui, ignorez-le
  4. si non, nous devrions vérifier s'il existe en b
  5. si c'est le cas, imprimez-le
  6. Voici le code. Je ne l'ai pas vérifié. Mais je pense que cela devrait fonctionner. L'idée générale est claire, je suppose.

      for (int i = 0; i < al; i++) {
            flagDubl = false;
            //!!here I've changed your code !!
            for (int j = 0; j < i ; j++) {
                // duplicates exist
                if (a[i] == a[j] ) {
                    flagDubl = true;
                    break;
                }
            }
            //ignore if it is dublicate
            if (!flagDubl) {
                for (int j = 0; j < bl; j++){
                    if (a[i] == b[j]) {
                        //it is in both arrays;
                        System.out.print( a[i] + " ");
                        break;
                    }
    
                }
            }
        }
    

0 commentaires

0
votes

Si vous voulez un chemin paresseux, valide et court, utilisez une structure de données pour stocker des valeurs communes et utilisez-en une qui n'autorise pas les doublons, un Set préférence.

Dans l'exemple suivant, j'ai utilisé un TreeSet car, en plus de ne pas autoriser les entrées en double, il compareTo les valeurs en utilisant leur méthode compareTo :

Common values of a and b (no duplicates, ordered ascending) are:
-8
0
1
2
3
9
16

Cela génère les éléments suivants:

public static void main(String[] args) {
    int[] a = { 6, 0, 2, -7, 16, 9, 1, -8, 9, 9, 3, -9, -1, 0, 1, -8, 2, 99 };
    int[] b = { 16, 0, 5, 2, -5, 3, 3, 9, 9, 1, -8, -8 };

    // prepare a data structure to store the common values
    Set<Integer> commonValues = new TreeSet<>();

    // then compare each value of a to each value of b
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < b.length; j++) {
            // and if they are equal,
            if (a[i] == b[j]) {
                // store one of the values in the set
                commonValues.add(a[i]);
            }
        }
    }

    // then print all the values of the set
    System.out.println("Common values of a and b (no duplicates, ordered ascending) are:");
    commonValues.forEach(System.out::println);
}


0 commentaires