Question : Par exemple, j'ai un tableau (le nombre d'éléments est 0), et j'espère que les éléments ajoutés ne seront pas répétés.
Quand je reçois une telle question, je peux écrire rapidement le code. Le tableau ici utilise ArrayList.
private static void testListSet(){ List<String> arrays = new ArrayList<String>(){ @Override public boolean add(String e) { for(String str:this){ if(str.equals(e)){ System.out.println("add failed !!! duplicate element"); return false; }else{ System.out.println("add successed !!!"); } } return super.add(e); } }; arrays.add("a");arrays.add("b");arrays.add("c");arrays.add("b"); for(String e:arrays) System.out.print(e); }
Je ne me soucie de rien ici, je me soucie seulement de porter des jugements lors de l'ajout d'éléments au tableau (bien sûr , l'ajout d'éléments du tableau utilise uniquement la méthode add), si le même élément existe déjà, si l'élément n'existe pas dans le tableau, il est ajouté au tableau, et vice versa. C'est peut-être simple à écrire ainsi, mais cela semble maladroit face à un tableau énorme : s'il y a un élément dans un tableau de 100 000 éléments, devons-nous appeler égal 100 000 fois ? Voici les bases.
Question : Après avoir ajouté un tableau contenant déjà certains éléments, comment supprimer les éléments en double dans le tableau ?
Tout le monde sait que les collections en Java peuvent généralement être divisées en deux catégories : List et Set. Les éléments de la collection de la classe List doivent être ordonnés mais peuvent être répétés, tandis que les éléments de la collection de la classe Set doivent être désordonnés mais ne peuvent pas être répétés. Ensuite, vous pouvez déterminer si l'utilisation de la fonctionnalité Définir pour supprimer les éléments en double permettra d'atteindre l'objectif. Après tout, l'utilisation de l'algorithme existant dans le système est meilleure que l'algorithme que vous écrivez maintenant.
public static void removeDuplicate(List<People> list){ HashSet<People> set = new HashSet<People>(list); list.clear(); list.addAll(set); } ivate static People[] ObjData = new People[]{ new People(0, "a"),new People(1, "b"),new People(0, "a"),new People(2, "a"),new People(3, "c"), };
public class People{ private int id; private String name; public People(int id,String name){ this.id = id; this.name = name; } @Override public String toString() { return ("id = "+id+" , name "+name); } }
Le code ci-dessus utilise une classe People personnalisée. Lorsque j'ajoute le même objet (en faisant référence au même contenu de données), j'appelle la méthode removeDuplicate et constate que cela ne résout pas le problème réel. Alors, comment déterminer si les objets sont identiques dans HashSet ? Ouvrez le code source de HashSet et vous constaterez que chaque fois que vous y ajoutez des données, vous devez appeler la méthode add :
@Override public boolean add(E object) { return backingMap.put(object, this) == null; }
La backingMap ici est les données conservées par HashSet. Elle utilise une méthode très intelligente pour ajouter l'objet à chaque fois. . En tant que KEY dans HashMap, l'objet HashSet lui-même est traité comme VALUE. Cela profite de la propriété KEY dans Hashmap et, naturellement, les données de HashSet ne seront pas répétées. Mais l'existence ou non de véritables données en double dépend de la manière de déterminer si deux clés sont identiques dans HashMap.
@Override public V put(K key, V value) { 390 if (key == null) { 391 return putValueForNullKey(value); 392 } 393 394 int hash = secondaryHash(key.hashCode()); 395 HashMapEntry<K, V>[] tab = table; 396 int index = hash & (tab.length - 1); 397 for (HashMapEntry<K, V> e = tab[index]; e != null; e = e.next) { 398 if (e.hash == hash && key.equals(e.key)) { 399 preModify(e); 400 V oldValue = e.value; 401 e.value = value; 402 return oldValue; 403 } 404 } 405 406 // No entry for (non-null) key is present; create one 407 modCount++; 408 if (size++ > threshold) { 409 tab = doubleCapacity(); 410 index = hash & (tab.length - 1); 411 } 412 addNewEntry(key, value, hash, index); 413 return null; 414 }
En général, l'idée ici est de parcourir les éléments dans la hashmap. Si les codes de hachage des éléments sont égaux (en fait, les codes de hachage doivent être traités une fois), alors jugez la méthode eqaul de KEY. Si ces deux conditions sont remplies, alors ce sont des éléments différents. Ensuite, si le type d'élément dans le tableau est personnalisé et que vous souhaitez utiliser le mécanisme Set, vous devez implémenter égal et hashmap vous-même (l'algorithme de hashmap ne sera pas présenté en détail ici, je ne peux que le comprendre) méthode :
public class People{ private int id; // private String name; public People(int id,String name){ this.id = id; this.name = name; } @Override public String toString() { return ("id = "+id+" , name "+name); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object obj) { if(!(obj instanceof People)) return false; People o = (People)obj; if(id == o.getId()&&name.equals(o.getName())) return true; else return false; } @Override public int hashCode() { // TODO Auto-generated method stub return id; //return super.hashCode(); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!