Maison  >  Article  >  Java  >  Comment supprimer les éléments en double du tableau en Java

Comment supprimer les éléments en double du tableau en Java

王林
王林avant
2023-05-01 10:28:061185parcourir

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer