Comment éviter que des entiers en double soient ajoutés dans un tableau d'entiers sans utiliser l'une des collections, à savoir Arraylist ou Set etc.?Éviter les entiers en double dans un tableau d'entiers
Répondre
Si votre problème est de retourner un Integer[]
, et aucune autre collection, vous pouvez cependant utiliser un Set<Integer>
private
ment pour éviter les valeurs dupliquées, puis revenez Set<Integer>.toArray(new Integer[0])
.
C'est la façon la plus simple à mon humble avis ...
Par exemple:
private Set<Integer> intSet = new HashSet<Integer>();
public void setIntArray(Integer[] i){
intSet = new HashSet<Integer>(Arrays.asList(i));
}
public Integer[] getIntArray(){
return intSet.toArray(new Integer[0]);
}
sans utiliser aucune des collections, c'est-à-dire Arraylist ou Set etc.?
juste vérifier par tableau avant l'insertion,
vous pouvez utiliser insertion sort et faire le binarysearch il serait peu plus vite
- Ecrivez une méthode qui ajoute la valeur au tableau.
- Avant d'ajouter, scannez le tableau si la valeur existe.
- Sautez l'addition si elle existe.
- Utilisez seulement cette méthode pour ajouter des valeurs au tableau.
- Idéalement regrouper le tableau et la méthode dans une classe. Voila: encapsulation!
Vous pouvez créer un autre tableau, nous allons l'appeler exists
, de type booléen. Ensuite, chaque fois que vous ajoutez un entier à votre liste principale, vérifiez si exists[newNumber]
. Si la valeur est true, elle existe déjà, sinon ajoutez le nombre au tableau entier et définissez la valeur booléenne sur true.
Cette solution fonctionne bien si la plage de nombres a une petite limite. Notez, mon exemple suppose également que l'entier est positif. Une optimisation consiste à utiliser un tableau long [] et à utiliser chaque bit comme indicateur.
Tout d'abord, supposons que le tableau est un tampon et dispose d'espace supplémentaire. Il suffit de faire une boucle pour vérifier chaque valeur. Comme tel
for(int i=0; i<endpointer &&i < buffer.length ; i++){
if(buffer[i]==valueToPutInArray){
valueExists=true;
break;
}
}
if(!valueExists) {
buffer[endpointer++]=valueToPutInArray;
}
Si le tableau est doit être réaffecté alors vous devez faire quelque chose comme ceci:
int i=0;
Integer[] outputArray = new Integer[buffer.length+1];
for(Integer value : buffer) {
if(value==valueToPutInArray){
valueExists=true;
break;
}
outputArray[i++]=value;
}
if(!valueExists) {
outputArray[i]=valueToPutInArray;
}
Je vous suggère d'abord vous effectuez Arrays.sort (int []). Utilisez ensuite Arrays.binarySearch (int [], int) pour vérifier si l'élément existe ou non.
Selon javadoc:
/**
* Sorts the specified array of ints into ascending numerical order.
* The sorting algorithm is a tuned quicksort, adapted from Jon
* L. Bentley and M. Douglas McIlroy's "Engineering a Sort Function",
* Software-Practice and Experience, Vol. 23(11) P. 1249-1265 (November
* 1993). This algorithm offers n*log(n) performance on many data sets
* that cause other quicksorts to degrade to quadratic performance.
*
* @param a the array to be sorted
*/
public static void sort(int[] a) {
sort1(a, 0, a.length);
}
et BinarySearch:
/**
* Searches the specified array of ints for the specified value using the
* binary search algorithm. The array must be sorted (as
* by the {@link #sort(int[])} method) prior to making this call. If it
* is not sorted, the results are undefined. If the array contains
* multiple elements with the specified value, there is no guarantee which
* one will be found.
*
* @param a the array to be searched
* @param key the value to be searched for
* @return index of the search key, if it is contained in the array;
* otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>. The
* <i>insertion point</i> is defined as the point at which the
* key would be inserted into the array: the index of the first
* element greater than the key, or <tt>a.length</tt> if all
* elements in the array are less than the specified key. Note
* that this guarantees that the return value will be >= 0 if
* and only if the key is found.
*/
public static int binarySearch(int[] a, int key) {
return binarySearch0(a, 0, a.length, key);
}
Et on vous savez si l'élément existe ou non, le repos est facile pour vous.
La solution dépend de vos besoins. Si vous avez une petite taille du tableau (n < 10^6), balayage à travers le réseau à chaque insertion suffirait, mais si vous avez un grand tableau et insertions fréquentes, je propose une autre solution.
La numérisation d'un tableau à chaque insertion nécessiterait une complexité de O (n). Pour les petits nombres, l'overhead est ignorable, mais à mesure que la taille du tableau augmente, la traversée à chaque insertion est inefficace.
Si vous avez besoin de performances et si la mémoire n'est pas votre contrainte, vous pouvez prendre un tableau booléen et initialiser tous les éléments à false. Ensuite, chaque fois que vous obtenez un numéro, assurez-vous de sa valeur d'index dans le tableau booléen à vrai, et lors de l'insertion, vérifiez si la valeur booléenne au numéro d'index de l'élément inséré.
Voici le code pour initialiser le tableau booléen (initialisation cela rendrait tous les éléments faux):
boolean [] duplicateValuesArray = new boolean[Integer.MAX_VALUE];
est la fonction ici qui insère un élément dans le tableau:
public void insertElement(int elementToBeInserted) {
if(!duplicateValuesArray[elementToBeInserted]) //check if element already in array
duplicateValuesArray[elementToBeInserted] = true;
mainArray[index++] = elementToBeInserted;
}
Dans de cette façon, chaque fois que vous obtenez un numéro, la valeur de cet indice dans le tableau booléen est réglé sur vrai, et pendant l'insertion, à chaque fois est vérifié l'indice, si la valeur est vrai, cet élément existe dans le tableau, ne l'insérez pas.
La complexité de c'est beaucoup plus faible si vous avez un grand mainArray(n> 10^6) et vous avez des insertions fréquentes. C'est parce que, l'initialisation d'un tableau booléen est une fois O (n) complexité, et après cela, la vérification de l'élément dans le tableau booléen et l'insertion de l'élément est O (1) opération, arrive à temps constant.
complexité Ainsi efficace est réduite à seulement initialiser le tableau booléen. Et même en termes d'empreinte mémoire, cela ne me dérangerait pas car un primitif booléen occupe juste un bit dans la mémoire.
P.S: Fondamentalement, il est une mémoire vs le commerce de performances hors, ce qui est le commerce Computing Universal off, trouve partout.
+1 pour explorer la complexité et la performance dans ce cas –
- 1. éviter les valeurs en double dans datatable
- 2. Éviter les données en double dans les buffers OpenGL
- 3. Comment initialiser tous les entiers dans un tableau en Java?
- 4. Comment éviter un article en double?
- 5. Tourner entiers dans un tableau
- 6. Comment éviter les nombres aléatoires en double
- 7. entiers foreach dans un tableau
- 8. Prévention des entiers en double dans la matrice
- 9. Comment éviter le nombre aléatoire en double et en sélectionner un autre dans Android?
- 10. Éviter les ressources en double dans le projet android
- 11. éviter les doublons de tableau
- 12. Éviter les entrées en double dans le fichier xml C#
- 13. Comment éviter les enregistrements en double dans C#
- 14. Comment éviter les enregistrements en double dans MySQL
- 15. voulez éviter les images en double dans listview C# .NET
- 16. Éviter le code en double dans les constructeurs
- 17. comment éviter les images en double ajoutés dans le listview
- 18. Dans l'application Multi Flavor, comment éviter les ressources en double
- 19. PHP éviter la double foreach lors de la boucle dans un tableau d'un tableau
- 20. comment éviter les valeurs en double pour imprimer dans le tableau html
- 21. PHP - Les valeurs en double dans un tableau
- 22. Comment détecter les valeurs en double dans un tableau PHP?
- 23. Convertir ArrayList d'objets entiers en un tableau int?
- 24. Golang (débutant): Éviter les fonctions en double pour traiter les chaînes ou les ints
- 25. git: éviter les méthodes en double lors de la fusion
- 26. Suggestions pour éviter les produits en double de grattage
- 27. Éviter les noms de fichiers en double dans un dossier en Python
- 28. Comment verrouiller pour éviter les numéros en double
- 29. jQuery .load() Comment éviter le double chargement en double-cliquant
- 30. Requête MySQL - Éviter l'entrée en double
Vous devez soit (1) utiliser une autre collection (c'est-à-dire Hash) avec le tableau, soit (2) effectuer une recherche linéaire à chaque fois qu'un élément est ajouté. –
Vous ne pouvez pas utiliser 'l'une des collections, c'est-à-dire Arraylist ou Set'? ou vous avez juste à retourner un tableau d'entiers? – davioooh
Est-ce [tag: devoirs]? Si c'est le cas, il est avantageux de l'étiqueter comme tel. –