En supprimant les doublons d'un tableau (sans jeux de ou de tri)
J'ai le code suivant:
import java.util.Scanner;
public class ArrayDuplicates {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("How many numbers are you going to enter? ");
int num = scan.nextInt();
int[] arr = new int[num]; //initialize array with user inputted length
for (int i = 0; i < arr.length; i++) { //enter numbers into array
arr[i] = scan.nextInt();
}
int[] unique = new int[arr.length]; //initialize new array that will hold unique values
for (int i = 0; i < arr.length; i++) {
boolean b = true; //boolean that checks if an element is a duplicate
for (int j = i+1; j < arr.length; j++) { //check all elements above int i
if (arr[i] == arr[j]) {
b = false; //set b to false if there is an existing duplicate
}
}
if (b) {
unique[i] = arr[i]; //if no duplicates exist, then it is unique.
}
}
for (int i = 0; i < unique.length; i++) {
System.out.println(unique[i]);
}
}
}
Le problème avec ce code (en plus d'être horriblement lent pour de grands tableaux, mais ce n'est pas le point), c'est que depuis le non déclarées éléments pour la unique
tableau sera mis à 0
, le dupliquer des éléments du premier tableau sont en cours de mise à 0
dans unique[]
(si cela a un sens). Je comprends pourquoi cela arrive, mais ne peut pas trouver un moyen efficace de résoudre ce problème. J'ai essayé le réglage de la dupliquer des éléments de Integer.MIN_VALUE
dans la gamme unique et puis l'impression que les éléments de unique[]
qui ne sont pas égales à Integer.MIN_VALUE
, mais cela semble être une solution faible du problème. Comment puis-je résoudre ce problème?
EDIT: Si j'exécute le code:
Combien de numéros allez-vous entrer? 4
1
2
2
0
De sortie:
1
0
2
0
Depuis le deuxième élément du tableau est un doublon, je n'ai pas mis unique[1]
de toute valeur, rendant par défaut à 0. Comment puis-je éviter l'impression que 0, car il ne fait pas partie du tableau d'origine?
EDIT 2: Oui, c'est les devoirs, mais la raison pour laquelle je ne veux pas utiliser des ensembles, tri, etc. est surtout que je ne suis pas familier avec eux. Aussi, comme je ne suis pas demander à quelqu'un d'écrire l'ensemble du programme pour moi, je pense que c'est bien de demander un peu d'aide.
Avez-vous envisagé de ne pas ajouter les doublons dans le tableau en premier lieu?
On pouvait compter les éléments uniques dans
arr
avant la création de la unique
tableauSans l'aide d'une Liste ou de Définir la solution devient extrêmement pénible. Si vous avez de ne pas utiliser une Liste ou d'un Ensemble, je voudrais simplement vous suggérons de définir des valeurs en double en Entier.MIN_VALUE, comme vous l'avez dit, ou la création d'un parallèle de valeurs booléennes
Java les tableaux ne sont pas dynamiquement la taille, de sorte que vous ne pouvez pas supprimer, un élément sans plus de code. Aussi, le
Map
ou List
ne sont pas un Set
ou de tri.
OriginalL'auteur Kootling | 2014-10-25
Vous devez vous connecter pour publier un commentaire.
Je vais utiliser les outils que vous avez utilisé pour résoudre le problème, parce que quelque chose en moi me dit que ce sont les devoirs...
Donc, vous voyez où j'ai commenté mon montage? c'est la chose de nouveau, d'une manière très facile de le vérifier est de donner les valeurs d'un nombre qui est pas prévu, dans ce cas, un nombre négatif. Maintenant, c'est une hypothèse de ma part, le changement de -1 à la valeur que vous savez pas être conclu que
Scanner
. De même pour l'instruction if.double array
et l'utilisation0.5
que la valeur ne sera pas entré (la saisie des valeurs qui doivent être des nombres entiers, de sorte que de 0,5 ne devrait pas être entré).Ahhhhhh, bonne idée, je vais modifier ma réponse maintenant
OriginalL'auteur DreadHeadedDeveloper
Toute valeur que vous choisissez (de zéro, min-int, max-int) pour représenter la suppression d'un doublon est un problème. L'utilisateur peut toujours entrer un nombre, et que votre programme ne se comporte pas correctement. (La seule façon dont vous pourriez utiliser en toute légalité (dire) min-int ou max-int serait si les exigences clairement dit que ce nombre était d'une entrée non valide.)
La bonne façon de traiter avec des doublons est de garder un compteur du nombre de non-doubles, et assurez-vous que les doublons (ou les machines à sous qui devrait contenir entre eux) sont à l'extrémité supérieure de la matrice; c'est à dire les index >= le compteur. (Qui devient un invariant que votre algorithme doit maintenir ...)
La meilleure solution est d'éliminer les doublons avant de les ajouter à la matrice. Tenir le compte du nombre de non-doublons et itérer jusqu'à ce qui l'atteint de votre
num
... plutôt que de la longueur du tableau.Mais si vous ne souhaitez pas ajouter toutes les valeurs de la matrice et puis éliminer les doublons, quand vous trouvez un duplicata, vous devez échanger les éléments de sorte que vous pouvez maintenir l'invariant. La logique est un peu délicat ... mais tout à fait faisable.
Mise à JOUR
Je viens de remarquer que votre solution originale a été à l'aide de deux tableaux. J'ai supposé que vous étiez à l'aide d'un tableau, et de faire une mise à jour en place pour éliminer les doublons.
"L'idée d'avoir une qualité de réponse pour toute personne à utiliser." - la qualité de La réponse aux exigences fonctionnelles (comme indiqué) est de ne pas utiliser un tableau. (À l'aide d'un tableau n'est pas un fonctionnel exigences. C'est une mise en œuvre de la contrainte ... qui n'a pas beaucoup de sens pour ceux qui cherchent à écrire du code de qualité pour Java SE, EE, Android.)
Donc, ce que je comprends, c'est que je doit vérifier chaque entrée de type entier avec la précédente entrées et ajouter uniquement pour le tableau d'origine si elle est unique. Également avoir un compteur qui compte le nombre d'entrées ont été ajoutées à la matrice (c'est à dire les entrées qui sont uniques). Puis créer un nouveau tableau de longueur
counter
qui contient le premiercounter
éléments du tableau d'origine. Est-ce que vous êtes en train de dire? Dans ce cas, je ne serait pas nécessaire pour s'assurer que les doublons sont près de la fin du tableau, correct?Vous l'avez compris ce que je disais.
Peut-être que je me suis mal exprimée. Il dépend de vous d'éliminer les doublons avant ou après. Dans le premier cas, vous avez raison. Les doublons ne devrait pas être dans la matrice, et les fentes de plus que le "comte" de position peuvent être laissées dans leur état initial. (Il suffit de ne pas les imprimer ...) de toute façon, vous devriez penser à tout cela par vous-même plutôt que de prendre mon (ou de quelqu'un d'autre) sur parole.
OriginalL'auteur Stephen C
La meilleure façon de le faire est d'utiliser un Carte.
Je ne sais pas pourquoi vous ne voulez pas utiliser un jeu, sauf si vous êtes de faire ses devoirs...
Si vraiment vous ne pouvez pas utiliser un ensemble. Aller de l'avant et de créer un
ArrayList
. Stocker les éléments de laarray
à l'intérieur, mais à chaque fois que vous souhaitez stocker vous vérifier si l'élément est déjà une partie de laArrayList
.Vous pouvez, si vous le souhaitez, mettez votre
ArrayList
de retour dans un tableau.Je sais comment le faire avec un
ArrayList
, mais wow unMap
est tellement propre.C'est un outil qui a été créé pour ce genre de chose
Oui, c'est les devoirs, mais la raison pour laquelle je ne veux pas utiliser des ensembles, tri, etc. est surtout que je ne suis pas familier avec eux. Aussi, comme je ne suis pas demander à quelqu'un d'écrire l'ensemble du programme pour moi, je pense que c'est bien de demander un peu d'aide.
viens de lire ce qu'un
ArrayList
est: docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html En bref, elle est une des plus puissantes.OriginalL'auteur FunctionR
Vous pouvez stocker le maximum de la valeur entrée par l'utilisateur (si l'utilisateur est en saisissant les valeurs dans la première boucle) puis prendre la valeur par défaut pour unique est égal à max + 1.
Ou vous pouvez essayer une autre approche pour résoudre le problème, quelque chose comme ceci:
Noter que cette solution est sous l'hypothèse que l'utilisateur ne va pas entrer un nombre supérieur à
(num + 1,000,000)
.Mais cela prend seulement O(num + j).. Donc en fait c'est plus efficace 🙂
Cela ne veut pas dire grand chose lors de la création d'un million d'unité de tableau... l'efficacité peut enlever le capuchon lorsque la charge individuelle d'une action emporte sur l'efficacité de cette action
Il y a un compromis entre la performance et le stockage, la performance sage, c'est efficace, notez que nous n'allons pas pour itérer sur eux à tous.
Peu importe, la création de cette matrice va prendre du temps, temps que l'OP est déjà pressé. Peut-être je me suis mal exprimée, l'OP est préoccupé par le temps, et chaque action inutile, est préjudiciable à l'OP, si vous regardez ma réponse, un peu de conversion de type a rapidement résolu le problème de permis réponses sans passer overboards
OriginalL'auteur ms2r
Cette solution vous permet de saisir n'importe quelle valeur entière, même négatif. C'est le même code avec quelques modifications, et a ajouté un tableau parallèle pour les comparaisons. Il a aussi supprimé quelques lignes de code qui ne sont plus nécessaires.
OriginalL'auteur SkyMaster
Mettre en parallèle un tableau de caractères avec toutes les valeurs que '.' Chaque fois que vous trouvez un doublon, définissez la valeur de a ',' dans le tableau de caractères. Puis d'Imprimer uniquement les valeurs de votre tableau qui correspondent à un '.' dans le tableau de caractères.
}
OriginalL'auteur Guest
Exemple avec String [].
OriginalL'auteur mike_dz
public class RemoveDuplicateFromArray {
}
OriginalL'auteur BinDev
Alors que votre code semble en fait pour accomplir ce que le titre de la question demande, il ne concerne pas le code fourni dans la question. Aussi, vos réponses doivent toujours être accompagnée d'une explication pour rendre la lecture plus facile pour les gens qui ne connaissent pas le sujet.
OriginalL'auteur kamlesh