2010-02-02 3 views
1

J'ai eu du mal à créer une fonction pour trouver essentiellement tous les indices d'éléments en double dans un tableau multidimensionnel (non triés), dans ce cas, un tableau de 5x5, puis en utilisant les indices trouvés changer la éléments parallèles dans un tableau de score. Mais seulement trouver des doublons dans les colonnes et non par rapport aux autres colonnes dans le tableau Voici ce que j'ai fait jusqu'à présent, avec la recherche en ligne. Le principal problème avec ce code est qu'il trouvera tous les éléments en double mais pas les originaux. Par exemple: si le tableau contient les éléments: {{"a", "a", "a"}, {"b", "b", "b"}, {"a", "c", " a "}}, alors il devrait changer le tableau de score parallèle en: {{0,1,0}, {1,1,1}, {0,1,0}}. Mais à la place, il ne reconnaît que la dernière rangée et les doublons de la rangée supérieure.Trouver Tableau de dupliquer des éléments

code:

public static void findDuplicates(String a[][]) 
{ 
    System.out.println("*Duplicates*"); 
    Set set = new HashSet(); 
    for(int j = 0; j<a.length; j++) 
    { 
     for(int i=0; i < a[0].length; i++) 
     { 
      if(!set.contains(a[i][j])) 
      { 
       set.add(a[i][j]); 
      } 
      else 
      { 
       System.out.println("Duplicate string found at index " + i + "," + j); 
       scores[i][j] -= scores[i][j]; 
      } 

     } 
     set = new HashSet(); 
    } 
} 

Je sais que mon explication est un peu compliqué, mais nous espérons qu'il est assez compréhensible. Merci, Jake.

Répondre

3

Votre logique est incorrecte. Votre boucle extérieure est j et la boucle intérieure est i mais vous faites:

set.add(a[i][j]); 

Il devrait être l'inverse:

set.add(a[j][i]); 

Techniquement, vous pourriez obtenir une exception en dehors des limites si le tableau n'est pas NxN. Mais vous pouvez l'affirmer comme condition préalable.

Pour une raison quelconque vous définissez également à 0 avec:

scores[i][j] -= scores[i][j]; 

Pourquoi ne pas simplement:

scores[i][j] = 0; 

Mais pour trouver des doublons dans les colonnes:

public static void findDuplicates(String a[][]) { 
    for (int col=0; col<a[0].length; col++) { 
    Map<String, Integer> values = new HashMap<String, Integer>(); 
    for (int row=0; row<a.length; row++) { 
     Integer current = values.put(a[row][col], row); 
     if (current != null) { 
     scores[row][col] = 0; 
     scores[current][col] = 0; 
     } 
    } 
    } 
} 

COMMEnT ce travail?

  • J'ai retitré les variables de boucle à row et col. Il n'y a aucune raison d'utiliser i et j quand row et col sont beaucoup plus descriptif;
  • Comme vous, je suppose que le tableau d'entrée est correct comme condition préalable. Il peut être NxM (plutôt que simplement NxN) cependant;
  • J'utilise un Map pour stocker l'index de chaque valeur. Map.put() renvoie l'ancienne valeur si la clé est déjà dans Map. Si c'est le cas, vous avez trouvé un doublon;
  • Le courant (ligne, colonne) et (courant, col) sont mis à 0. Pourquoi soustraire le score de lui-même plutôt que de mettre simplement à 0?
  • si la valeur « a » est trouvé 3+ fois dans une colonne puis scores[current][col] seront mis à 0 plus d'une fois, ce qui est inutile, mais pas dangereux et rend le code plus simple. J'ai déclaré Map en utilisant des génériques. Ceci est utile et conseillé.Il dit le Map a String clés et Integer valeurs, ce qui économise un peu de coulée;
  • Il utilise également l'auto-boxing et l'auto-unboxing pour convertir un int (la variable de boucle) vers et à partir de la classe wrapper Integer.
Questions connexes